Ste*_*las 4 python group-by dataframe pandas pandas-groupby
我有一个相当大的csv,看起来像这样:
+---------+---------+
| Column1 | Column2 |
+---------+---------+
| 1 | 93644 |
| 2 | 63246 |
| 3 | 47790 |
| 3 | 39644 |
| 3 | 32585 |
| 1 | 19593 |
| 1 | 12707 |
| 2 | 53480 |
+---------+---------+
Run Code Online (Sandbox Code Playgroud)
我的意图是
例如,我想最终得到多个文件,如下所示:
+---+-------+----------------+
| 1 | 19593 | NewColumnValue |
| 1 | 93644 | NewColumnValue |
| 1 | 12707 | NewColumnValue |
+---+-------+----------------+
+---+-------+-----------------+
| 2 | 63246 | NewColumnValue |
| 2 | 53480 | NewColumnValue |
+---+-------+-----------------+
+---+-------+-----------------+
| 3 | 47790 | NewColumnValue |
| 3 | 39644 | NewColumnValue |
| 3 | 32585 | NewColumnValue |
+---+-------+-----------------+
Run Code Online (Sandbox Code Playgroud)
我设法使用单独的.py文件:
步骤1
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1')
df['NewColumn'] = 'NewColumnValue'
df.to_csv('ready.csv', index=False, header=False)
Run Code Online (Sandbox Code Playgroud)
第2步
import csv
from itertools import groupby
for key, rows in groupby(csv.reader(open("ready.csv")),
lambda row: row[0]):
with open("%s.csv" % key, "w") as output:
for row in rows:
output.write(",".join(row) + "\n")
Run Code Online (Sandbox Code Playgroud)
但我真的想学习如何在单个.py文件中完成所有内容.我试过这个:
# -*- coding: utf-8 -*-
#This processes a large CSV file.
#It will dd a new column, populate the new column with a uniform piece of data for each row, sort the CSV, and remove headers
#Then it will split the single large CSV into multiple CSVs based on the value in column 0
import pandas as pd
import csv
from itertools import groupby
df = pd.read_csv('source.csv')
df = df.sort_values('Column1')
df['NewColumn'] = 'NewColumnValue'
for key, rows in groupby(csv.reader((df)),
lambda row: row[0]):
with open("%s.csv" % key, "w") as output:
for row in rows:
output.write(",".join(row) + "\n")
Run Code Online (Sandbox Code Playgroud)
但它没有按预期工作,它给了我多个以每个列标题命名的CSV.
是不是因为我在使用单独的.py文件时删除了标题行而我在这里没有这样做?我不确定在拆分文件以删除标题时我需要做什么操作.
为什么不组合Column1并保存每个组?
df = df.sort_values('Column1').assign(NewColumn='NewColumnValue')
print(df)
Column1 Column2 NewColumn
0 1 93644 NewColumnValue
5 1 19593 NewColumnValue
6 1 12707 NewColumnValue
1 2 63246 NewColumnValue
7 2 53480 NewColumnValue
2 3 47790 NewColumnValue
3 3 39644 NewColumnValue
4 3 32585 NewColumnValue
Run Code Online (Sandbox Code Playgroud)
for i, g in df.groupby('Column1'):
g.to_csv('{}.csv'.format(i), header=False, index_label=False)
Run Code Online (Sandbox Code Playgroud)
感谢Unatiel的改进.header=False不会写标题,index_label=False也不会写索引列.
这会创建3个文件:
1.csv
2.csv
3.csv
Run Code Online (Sandbox Code Playgroud)
每个都具有对应于每个Column1组的数据.
| 归档时间: |
|
| 查看次数: |
6147 次 |
| 最近记录: |