Python 熊猫:将DF拆分为多个csv
我有一个CSV文件,如下所示:Python 熊猫:将DF拆分为多个csv,python,pandas,csv,Python,Pandas,Csv,我有一个CSV文件,如下所示: |100|Header1|Header2| |120| xxx | xxx | |120| yyy | yyy | |120| zzz | zzz | |200|Header3|Header4| |220| xxx | xxx | |220| yyy | yyy | |220| zzz | zzz | |300|Header5|Header6| |320| xxx | xxx | |320| yyy |
|100|Header1|Header2|
|120| xxx | xxx |
|120| yyy | yyy |
|120| zzz | zzz |
|200|Header3|Header4|
|220| xxx | xxx |
|220| yyy | yyy |
|220| zzz | zzz |
|300|Header5|Header6|
|320| xxx | xxx |
|320| yyy | yyy |
|320| zzz | zzz |
所有的头文件都从一系列的100个开始,这些头文件需要拆分为单独的csv文件。因此,在本例中,将有3个csv文件,其中一个具有第100行和第120行,第二个csv文件具有第200行和第220行,第三个csv文件具有第300行和第320行
100、200和300行表示新表的开始。在pandas中是否有一种有效的方法可以做到这一点,而不必在遇到100、200等时循环并创建新的csv文件?使用
groupby
:
df = pd.read_csv('test.txt',sep = '|',header=None)
df.drop([0,4],axis = 1,inplace = True)
for i,sd in df.groupby(df[1]//100):
sd.to_csv(f'test{i*100}.csv',index=False,header=False)
test.txt包含OP提供的原始数据:
|100|Header1|Header2|
|120| xxx | xxx |
|120| yyy | yyy |
|120| zzz | zzz |
|200|Header3|Header4|
|220| xxx | xxx |
|220| yyy | yyy |
|220| zzz | zzz |
|300|Header5|Header6|
|320| xxx | xxx |
|320| yyy | yyy |
|320| zzz | zzz |
输出:
它将创建3个文件test100.csv
,test200.csv
和test300.csv
test100.csv
100,Header1,Header2
120, xxx , xxx
120, yyy , yyy
120, zzz , zzz
test200.csv
200,Header3,Header4
220, xxx , xxx
220, yyy , yyy
220, zzz , zzz
test300.csv
300,Header5,Header6
320, xxx , xxx
320, yyy , yyy
320, zzz , zzz
我会考虑使用纯Python方法< /P>
with open('test.csv') as fh:
current_file_handle = None
current_file_name = None
for line in fh.readlines():
p0 = line.find('|') + 1
p1 = line[p0:].find('|') + p0
if current_file_name != f'{line[p0]}00':
current_file_name = line[p0:p1]
current_file_handle = open(f'test_{current_file_name}.csv', 'w')
current_file_handle.write(line)
current_file_handle.close()
Getting TypeError:/:'str'和'int'@dev的操作数类型不受支持这应该适用于您提供的文本文件的结构(所有管道
|
运算符和所有)。如果不是这样,请提供您拥有的原始文件的一部分。100 | Header1 | Header2 | Header3 120 | Val1 | Val2 | Val3 120 | Val4 | Val5 200 | Header4 | Header5 220 | Val6 | Val7 220 | Val7 | Val8 220 | Val9 | Val10
@dev Ohh,删除我代码中的drop语句,它应该对您有用you@dev即使在移除后,如果它不起作用,或者有一些列留下了NA值,请编辑您的问题以包含这些数据,因为从注释中理解数据的结构有点困难。