将数据框拆分为单独的 CSV 文件
Splitting a dataframe into separate CSV files
我有一个相当大的 csv,看起来像这样:
+---------+---------+
| Column1 | Column2 |
+---------+---------+
| 1 | 93644 |
| 2 | 63246 |
| 3 | 47790 |
| 3 | 39644 |
| 3 | 32585 |
| 1 | 19593 |
| 1 | 12707 |
| 2 | 53480 |
+---------+---------+
我的意图是
- 添加新列
- 在 csv 的每一行 'NewColumnValue' 的列中插入特定值
- 根据列 1 中的值对文件进行排序
- 根据 'Column1' 的内容将原始 CSV 拆分为新文件,删除 header
例如,我希望得到多个如下所示的文件:
+---+-------+----------------+
| 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 header。
发生这种情况是因为我在使用单独的 .py 文件时删除了 header 行,而我没有在这里这样做吗?我不太确定拆分文件以删除 header.
时需要执行什么操作
您无需切换到 itertools
进行过滤,pandas
具有所有必要的内置功能。
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1') # Sorting isn't needed
df['NewColumn'] = 'NewColumnValue'
for key in df['Column1'].unique(): # For each value in Column1
# These two steps can be combined into a single call
# I'll separate for clarity:
# 1) filter the dataframe on the unique value
dw = df[df['Column1']==key]
# 2) write the resulting dataframe without headers
dw.to_csv("%s.csv" % key, header=False)
pandas.DataFrame
支持将其数据写入 csv to_csv()
的方法。在这种情况下,您不需要 csv
模块。
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1').set_index('Column1')
df['NewColumn'] = 'NewColumnValue'
for key in df.index.unique():
df.loc[key].to_csv('%d.csv' % int(key), header=False)
for key df.index.unique():
将遍历索引中的每个唯一值。在您的示例中,它将遍历 (1, 2 , 3)
。 header=False
将确保 header 未写入输出文件。
并解释为什么在您的示例中得到错误的输出,请尝试 print(list(df))
。这应该输出 df 中的所有列。这就是 for key, rows in csv.reader((df)):
遍历 df.
中的列的原因
实际上,您应该为数据框中的每一列获取 1 个 csv,它们的内容可能类似于 ,[NAME_OF_COLUMN]
或 ,<itertools.... object at 0x.....>
.
为什么不直接分组 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
for i, g in df.groupby('Column1'):
g.to_csv('{}.csv'.format(i), header=False, index_label=False)
感谢 Unatiel improvement。 header=False
不会写headers,index_label=False
不会写索引列。
这将创建 3 个文件:
1.csv
2.csv
3.csv
每个都有对应于每个Column1
组的数据。
我有一个相当大的 csv,看起来像这样:
+---------+---------+
| Column1 | Column2 |
+---------+---------+
| 1 | 93644 |
| 2 | 63246 |
| 3 | 47790 |
| 3 | 39644 |
| 3 | 32585 |
| 1 | 19593 |
| 1 | 12707 |
| 2 | 53480 |
+---------+---------+
我的意图是
- 添加新列
- 在 csv 的每一行 'NewColumnValue' 的列中插入特定值
- 根据列 1 中的值对文件进行排序
- 根据 'Column1' 的内容将原始 CSV 拆分为新文件,删除 header
例如,我希望得到多个如下所示的文件:
+---+-------+----------------+
| 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 header。
发生这种情况是因为我在使用单独的 .py 文件时删除了 header 行,而我没有在这里这样做吗?我不太确定拆分文件以删除 header.
时需要执行什么操作您无需切换到 itertools
进行过滤,pandas
具有所有必要的内置功能。
# -*- coding: utf-8 -*-
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1') # Sorting isn't needed
df['NewColumn'] = 'NewColumnValue'
for key in df['Column1'].unique(): # For each value in Column1
# These two steps can be combined into a single call
# I'll separate for clarity:
# 1) filter the dataframe on the unique value
dw = df[df['Column1']==key]
# 2) write the resulting dataframe without headers
dw.to_csv("%s.csv" % key, header=False)
pandas.DataFrame
支持将其数据写入 csv to_csv()
的方法。在这种情况下,您不需要 csv
模块。
import pandas as pd
df = pd.read_csv('source.csv')
df = df.sort_values('Column1').set_index('Column1')
df['NewColumn'] = 'NewColumnValue'
for key in df.index.unique():
df.loc[key].to_csv('%d.csv' % int(key), header=False)
for key df.index.unique():
将遍历索引中的每个唯一值。在您的示例中,它将遍历 (1, 2 , 3)
。 header=False
将确保 header 未写入输出文件。
并解释为什么在您的示例中得到错误的输出,请尝试 print(list(df))
。这应该输出 df 中的所有列。这就是 for key, rows in csv.reader((df)):
遍历 df.
实际上,您应该为数据框中的每一列获取 1 个 csv,它们的内容可能类似于 ,[NAME_OF_COLUMN]
或 ,<itertools.... object at 0x.....>
.
为什么不直接分组 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
for i, g in df.groupby('Column1'):
g.to_csv('{}.csv'.format(i), header=False, index_label=False)
感谢 Unatiel improvement。 header=False
不会写headers,index_label=False
不会写索引列。
这将创建 3 个文件:
1.csv
2.csv
3.csv
每个都有对应于每个Column1
组的数据。