2017-05-30 43 views
1

我的CSV看起來是這樣的:csv - 我如何使用python和pandas獲取某一行中某行的值?

name;  street;   number; 
------------------------------------ 
Jimmy;  Nice Street 24; 24; 
Carl;  Great Street; 128; 
Tim;   Long Street 5; - ; 
... 

我讀了CSV像這樣的熊貓:

data = pd.read_csv(r'export.csv') 
x = data[['name', 'street', 'number']] 

正如你可以看到用戶沒有輸入正確的ADRESS在1號線和2

所以我想要做的是檢查每個街道名稱的名稱,如果 已經有一個數字。如果存在,則從street行中刪除該數字,並將其放入number行(如果還沒有)。 以後所有行應該看起來像第2行。

我是新來的蟒蛇和大熊貓,無法找出最順利的方式來做到這一點。任何輸入都非常簡單!

回答

0

您可以使用str.extractcombine_first用於替換NaN s到原來的值,重新排序列使用reindex_axis

df = pd.read_csv(r'export.csv', sep=';', skiprows=[1], skipinitialspace=True) 

#if necessary remove columns full of NaNs 
df = df.dropna(how='all', axis=1) 
df1 = df['street'].str.extract('(?P<street>[a-zA-z\s]+) (?P<number>\d+)', expand=True) 
print (df1) 
     street number 
0 Nice Street  24 
1   NaN NaN 
2 Long Street  5 

df = df1.combine_first(df).reindex_axis(df.columns, axis=1) 
print (df) 
    name  street number 
0 Jimmy Nice Street  24 
1 Carl Great Street 128 
2 Tim Long Street  5 
1

我會考慮在源CSV刪除尾部分隔符。但這不是必要的。

該代碼會做的魔力:

import pandas as pd 
import re 


def check_street_no(row): 
    number_match = re.search(r'\d+$', row['street']) 
    if number_match is not None: 
     row['number'] = number_match.group() 
     row['street'] = re.sub(r' *\d+$', '', row['street']) 
    return row 

data = pd.read_csv(r'streets.csv', sep=';', skiprows=[1], skipinitialspace=True) 
data = data.apply(check_street_no, axis=1) 
print(data) 

輸出:

name  street number 
0 Jimmy Nice Street  24 
1 Carl Great Street 128 
2 Tim Long Street  5 
相關問題