【发布时间】:2018-02-17 20:46:13
【问题描述】:
我有一个相当大的 csv,如下所示:
+---------+---------+
| Column1 | Column2 |
+---------+---------+
| 1 | 93644 |
| 2 | 63246 |
| 3 | 47790 |
| 3 | 39644 |
| 3 | 32585 |
| 1 | 19593 |
| 1 | 12707 |
| 2 | 53480 |
+---------+---------+
我的目的是
- 添加新列
- 在 csv 每一行的该列“NewColumnValue”中插入一个特定值
- 根据 Column1 中的值对文件进行排序
- 根据 'Column1' 的内容将原始 CSV 拆分为新文件,删除标题
例如,我希望得到多个文件,如下所示:
+---+-------+----------------+
| 1 | 19593 | NewColumnValue |
| 1 | 93644 | NewColumnValue |
| 1 | 12707 | NewColumnValue |
+---+-------+----------------+
+---+-------+-----------------+
| 2 | 63246 | NewColumnValue |
| 2 | 53480 | NewColumnValue |
+---+-------+-----------------+
+---+-------+-----------------+
| 3 | 47790 | NewColumnValue |
| 3 | 39644 | NewColumnValue |
| 3 | 32585 | NewColumnValue |
+---+-------+-----------------+
我已经设法使用单独的 .py 文件来做到这一点:
第一步
# -*- 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)
第二步
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")
但我真的很想学习如何在一个 .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")
但它没有按预期工作,而是为我提供了多个以每个列标题命名的 CSV。
发生这种情况是因为我在使用单独的 .py 文件时删除了标题行,而我没有在这里做吗?我不确定在拆分文件以删除标题时需要执行什么操作。
【问题讨论】:
标签: python pandas dataframe group-by pandas-groupby