2017-09-23 125 views
1

我有一個看起來像這樣的csv文件(由於它們涉及天,訪問不能被聚合,例如2 =星期一,3 =星期二..等)將列中的數字拆分爲單獨列中的數字

enter image description here

我想拆分「訪問」列,以便我將每個數字放在單獨的列中。事情是這樣的:

enter image description here

我怎樣才能做到這一點與Python?我想要有與數字位數一樣多的列。我有1000行

我開始使用這段代碼,但它不起作用。

import pandas as pd 
file=pd.read_csv('file.csv') 

data = [] 
with open('file.csv', 'r') as fh: 
for line in fh: 
data.append(line.split()) 

data = dict(zip(*data)) 
d = { v for in [int(c)]) 
data['visits'][1:])]} 
d['ID'] = data['ID'] 
d['visits'] = data['visits'][0] 
data = pd.DataFrame(d) 
+0

首先:你確定位數總是一樣的嗎?如果情況並非如此,那麼您可能需要做其他事情(例如,在該列上應用功能)。 – pazqo

+0

@pazqo看着它,我會說不。這是一個大文件(1000行)。這就是爲什麼我想使用Python。 – Supern92

+0

你想分割數字或_numbers_?分裂數字似乎毫無意義。另外,你可以在文本中粘貼一些數據嗎?與流行的看法相反,圖片沒有幫助。 –

回答

3

使用str.split

df 

    ID  visits 
0 1 12 1 40 50 
1 2 56 2 567 34 
2 3 4 5 345 78 

visits = df['visits'].str.split(expand=True).add_prefix('visit_')  
visits 

    visit_0 visit_1 visit_2 visit_3 
0  12  1  40  50 
1  56  2  567  34 
2  4  5  345  78 

接下來,串聯visitsID

df = pd.concat([df[['ID']], visits], 1)  
df 

    ID visit_0 visit_1 visit_2 visit_3 
0 1  12  1  40  50 
1 2  56  2  567  34 
2 3  4  5  345  78 

如果你想每個號碼的每個數字分別,你會鏈df.apply通話。此外,要用0代替8,請使用df.replace

visits = df['visits'].str.replace('\s+', '')\ 
      .apply(lambda x: pd.Series(list(x))).add_prefix('visit_')\ 
      .replace('[89]', 0, regex=True) 
visits 

    ID visit_0 visit_1 visit_2 visit_3 visit_4 visit_5 visit_6 visit_7 
0 1  1  2  1  4  0  5  0  NaN 
1 2  5  6  2  5  6  7  3  4 
2 3  4  5  3  4  5  7  0  NaN 

請注意,每列是一列字符串(object類型)。但是,如果你想要它們作爲整數,你會想擺脫NaN s。如果你可以放棄NaN列,這個解決方案簡化了一點。

visits = df.visits.str.replace('\s+', '')\ 
      .apply(lambda x: pd.Series(list(x)))\ 
      .dropna(axis=1).add_prefix('visit_').astype(int) % 8 
visits 

    visit_0 visit_1 visit_2 visit_3 visit_4 visit_5 visit_6 
0  1  2  1  4  0  5  0 
1  5  6  2  5  6  7  3 
2  4  5  3  4  5  7  0 

你仍然需要連接visits使用pd.concatdf.ID

相關問題