如何基于更改一列(例如ID)来将大型csv拆分为多列?这是一个例子:
import pandas as pd
from pandas.compat import StringIO
csvdata = StringIO("""ID,f1
1,3.2
1,4.3
1,10
7,9.1
7,2.3
7,4.4
""")
df = pd.read_csv(csvdata, sep=",")
df
我的目标是将每个块保存在单独的csv中,其名称根据ID在循环中生成:
df_ID_1.csv
ID f1
1 3.2
1 4.3
1 10.0
df_ID_7.csv
ID f1
7 9.1
7 2.3
7 4.4
非常感谢您!
答案 0 :(得分:2)
只需循环浏览ID,为每个ID创建一个切片的数据框,然后创建.csv文件
for id in df['ID'].unique():
temp_df = df.loc[df['ID'] == id]
file_name = "df_ID_{}".format(id)
# make the path to where you want it saved
file_path = "C:/Users/you/Desktop/" + file_name
# write the single ID dataframe to a csv
temp_df.to_csv(file_path)
答案 1 :(得分:2)
您可以为此使用groupby
方法并访问每个单独的组,然后使用pandas.to_csv
将其写入csv。
for _, r in df.groupby('ID'):
r.to_csv(f'df_ID_{r.ID.iloc[0]}')
或者如果您的Python版本是<3.5,请使用.format
而不是f-string
进行字符串格式化:
for _, r in df.groupby('ID'):
r.to_csv('df_ID_{}.csv'.format(r.ID.iloc[0]))
我们使用的循环的说明:
for _, r in df.groupby('ID'):
print(r, '\n')
print(f'This is our ID {r.ID.iloc[0]}', '\n')
ID f1
0 1 3.2
1 1 4.3
2 1 10.0
This is our ID 1
ID f1
3 7 9.1
4 7 2.3
5 7 4.4
This is our ID 7
答案 2 :(得分:0)
不使用熊猫:使用csv module
读取文件,按指定的列排序,使用itertools
模块按指定的列分组,遍历各组并写入新文件。
import itertools, csv
key = operator.itemgetter('ID')
# assumes csvdata is a filelike object (io.StringIO in OP's example)
reader = csv.DictReader(csvdata)
fields = reader.fieldnames
data = sorted(reader, key = key)
for key,group in itertools.groupby(data, key):
with open(f'ID_{key}.csv', 'w')as f:
writer = csv.DictWriter(f, fields)
writer.writeheader()
writer.writerows(group)