2016-11-24 42 views
0

我有一系列的大的CSV文件 「basename.csv」 之類的第一個字符分割CSV文件:的Python:根據第一列

B1,3,5,6

B2,2, 1,5-

B3,1,9,0

C1,4,7,9

C2,1,9,3

C3,8,5,2

我想將它們分成不同的類似文件:

basename_B.csv

B1,3,5,6

B2,2,1,5

B3, 1,9,0

basename_C.csv

C1,4,7,9

C2,1,9,3

C3,8,5,2

我已經做過類似的事情在for循環和IFS過去,但我不知道是否有更有效的方法來做到這一點熊貓或任何其他。

SOLUTION

適應從@chthonicdaemon和@jezrael的解決方案,我想出了這個:

def split_csv(): 
    for dfile in glob.glob('*.csv'): 
     df = pd.read_csv(dfile, header=None) 
     for letter, group in df.groupby(df[0].str[0]): 
      group.to_csv((os.path.splitext(dfile)[0]) + '_{}.csv'.format(letter), index=False, header=False) 

split_csv() 
+0

你可以做'df.ix [:,df.columns.str.startswith( 'B')]'過濾的cols – EdChum

+0

是的,謝謝你,事情是,我不知道哪個字母每個文件中是否存在。我當然可以創建一個獨特的字母列表並循環,但我想知道是否有更優雅的解決方案。另外,您的解決方案還可以獲取除第一個之外的列。 – mirix

回答

3

這裏是groupby一個簡單的應用:

df = pandas.read_csv('basename.csv', header=None) 

def firstletter(index): 
    firstentry = df.ix[index, 0] 
    return firstentry[0] 

for letter, group in df.groupby(firstletter): 
    group.to_csv('basename_{}.csv'.format(letter)) 

或者,通過列的明確的內容納入@ jezrael的用途分組:

for letter, group in df.groupby(df[0].str[0]): 
    group.to_csv('basename_{}.csv'.format(letter)) 
+0

非常感謝!鑑於所提出的兩種解決方案都可行,這更簡單,更優雅。 – mirix

+0

有問題,給我一下。 – jezrael

+2

請參閱'粗略的規則是任何時候你看到背對背的方括號,] [,你在問問題.'在http://tomaugspurger.github.io/modern-1.html – jezrael

2

我想你可以通過指數的第一級創建MultiIndex,然後groupby和使用to_csv

import pandas as pd 
from pandas.compat import StringIO 

temp=u"""B1,3,5,6 
B2,2,1,5 
B3,1,9,0 
C1,4,7,9 
C2,1,9,3 
C3,8,5,2""" 
#after testing replace StringIO(temp) to filename 
df = pd.read_csv(StringIO(temp), header=None) 
print (df) 
    0 1 2 3 
0 B1 3 5 6 
1 B2 2 1 5 
2 B3 1 9 0 
3 C1 4 7 9 
4 C2 1 9 3 
5 C3 8 5 2 

另一個類似的溶液,作爲另一種答案:

for letter, g in df.groupby([df.iloc[:, 0].str[0]]): 
    #print (letter) 
    #print (g) 
    g.to_csv('basename_{}.csv'.format(letter)) 
+0

對不起,我認爲原來的問題還不清楚。我已經編輯它作爲一個例子。 – mirix

+0

給我第二個 – jezrael

+0

請看編輯的解決方案。 – jezrael

1

我測試了這個代碼,並要滿足您的要求。 example.csv將是csv輸入文件。

with open ('example.csv') as f: 
    r = f.readlines() 

for i in range(len(r)): 
    row = r[i] 
    letter = r[i].split(',')[0][0] 
    filename = "basename_"+letter.upper()+".csv" 
    with open(filename,'a') as f: 
     f.write(row) 
+1

這個解決方案的好處在於它純粹是pythonic,不需要熊貓。謝謝! – mirix

相關問題