Python: 根据第一列第一个字符拆分CSV文件
Python: Split CSV file according to first character of the first column
我有一系列大型 CSV 文件"basename.csv",例如:
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 做过类似的事情,但我想知道是否有更有效的方法用 Pandas 或其他什么来做这件事。
解决方案
采用@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()
我想你可以创建 MultiIndex
然后 groupby
by first level of index and use 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))
下面是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))
我测试了这段代码,应该可以满足您的要求。
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)
我有一系列大型 CSV 文件"basename.csv",例如:
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 做过类似的事情,但我想知道是否有更有效的方法用 Pandas 或其他什么来做这件事。
解决方案
采用@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()
我想你可以创建 MultiIndex
然后 groupby
by first level of index and use 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))
下面是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))
我测试了这段代码,应该可以满足您的要求。 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)