Python 如何使用pandas读取csv、附加新数据和写入新csv
我以前从未使用过熊猫,看起来我需要一些初始帮助。我在任何地方都找不到这个具体的例子 我有一个csv文件,比如file1.csv,如下所示:Python 如何使用pandas读取csv、附加新数据和写入新csv,python,pandas,csv,dataframe,Python,Pandas,Csv,Dataframe,我以前从未使用过熊猫,看起来我需要一些初始帮助。我在任何地方都找不到这个具体的例子 我有一个csv文件,比如file1.csv,如下所示: ID value1 value2 1 100 200 2 101 201 ID value1 value2 value3 value4 1 100 200 10 20 2 101
ID value1 value2
1 100 200
2 101 201
ID value1 value2 value3 value4
1 100 200 10 20
2 101 201 11 21
我需要从file1.csv一次读取一行,附加两个新列信息/数据,然后将所有内容写入名为file2.csv的新文件。file2.csv应该如下所示:
ID value1 value2
1 100 200
2 101 201
ID value1 value2 value3 value4
1 100 200 10 20
2 101 201 11 21
是否有人可以指导或给出一个简短的示例来说明如何执行此操作(读取文件1,附加新数据(value3和value4列),然后将其写入文件2)
附录:
我需要从文件1中一次读取一行,然后将一行写入文件2 以下程序将加载
file1.csv
,添加列'value3'
和'value4'
,并将结果数据帧作为csv输出
import pandas as pd
df = pd.read_csv('file1.csv')
df['value3'] = [10, 11]
df['value4'] = [20, 21]
df.to_csv('file2.csv')
file1.csv的内容
:
ID,value1,value2
1,100,200
2,101,201
,ID,value1,value2,value3,value4
0,1,100,200,10,20
1,2,101,201,11,21
file2.csv的内容
:
ID,value1,value2
1,100,200
2,101,201
,ID,value1,value2,value3,value4
0,1,100,200,10,20
1,2,101,201,11,21
下面将加载
file1.csv
,添加列'value3'
和'value4'
,并将结果数据帧作为csv输出
import pandas as pd
df = pd.read_csv('file1.csv')
df['value3'] = [10, 11]
df['value4'] = [20, 21]
df.to_csv('file2.csv')
file1.csv的内容
:
ID,value1,value2
1,100,200
2,101,201
,ID,value1,value2,value3,value4
0,1,100,200,10,20
1,2,101,201,11,21
file2.csv的内容
:
ID,value1,value2
1,100,200
2,101,201
,ID,value1,value2,value3,value4
0,1,100,200,10,20
1,2,101,201,11,21
使用
读取\u csv
和读取\u csv
。使用to_csv
中的索引
关键字arg保留或删除索引
In [117]: df = pd.read_csv('eg.csv')
In [118]: df
Out[118]:
col 1 col 2 col 3
0 4 5 6
1 7 8 9
In [119]: df['new col'] = 'data'
In [120]: df
Out[120]:
col 1 col 2 col 3 new col
0 4 5 6 data
1 7 8 9 data
In [121]: df.to_csv('eg.new.csv')
In [122]: new_df = pd.read_csv('eg.new.csv') # includes the index
In [123]: new_df
Out[123]:
Unnamed: 0 col 1 col 2 col 3 new col
0 0 4 5 6 data
1 1 7 8 9 data
In [124]: df.to_csv('eg.new.csv', index=False) # excludes index
In [125]: new_df = pd.read_csv('eg.new.csv')
In [126]: new_df
Out[126]:
col 1 col 2 col 3 new col
0 4 5 6 data
1 7 8 9 data
使用
读取\u csv
和读取\u csv
。使用to_csv
中的索引
关键字arg保留或删除索引
In [117]: df = pd.read_csv('eg.csv')
In [118]: df
Out[118]:
col 1 col 2 col 3
0 4 5 6
1 7 8 9
In [119]: df['new col'] = 'data'
In [120]: df
Out[120]:
col 1 col 2 col 3 new col
0 4 5 6 data
1 7 8 9 data
In [121]: df.to_csv('eg.new.csv')
In [122]: new_df = pd.read_csv('eg.new.csv') # includes the index
In [123]: new_df
Out[123]:
Unnamed: 0 col 1 col 2 col 3 new col
0 0 4 5 6 data
1 1 7 8 9 data
In [124]: df.to_csv('eg.new.csv', index=False) # excludes index
In [125]: new_df = pd.read_csv('eg.new.csv')
In [126]: new_df
Out[126]:
col 1 col 2 col 3 new col
0 4 5 6 data
1 7 8 9 data
虽然通常有更好的解决方案,如使用
Dask
、更改dtypes
或使用分类变量,但一种替代方法是简单地分块处理文件
import pandas as pd
# Read one line at at time. Change chunksize to process more lines at a time.
reader = pd.read_csv('test.csv', chunksize=1)
write_header = True # Needed to get header for first chunk
for chunk in reader:
# Do some stuff
chunk['val3'] = chunk.val1**2
chunk['val4'] = chunk.val2*4
# Save the file to a csv, appending each new chunk you process. mode='a' means append.
chunk.to_csv('final.csv', mode='a', header=write_header, index=False)
write_header = False # Update so later chunks don't write header
示例数据:test.csv 输出:final.csv
虽然通常有更好的解决方案,如使用
Dask
、更改dtypes
或使用分类变量,但一种替代方法是简单地分块处理文件
import pandas as pd
# Read one line at at time. Change chunksize to process more lines at a time.
reader = pd.read_csv('test.csv', chunksize=1)
write_header = True # Needed to get header for first chunk
for chunk in reader:
# Do some stuff
chunk['val3'] = chunk.val1**2
chunk['val4'] = chunk.val2*4
# Save the file to a csv, appending each new chunk you process. mode='a' means append.
chunk.to_csv('final.csv', mode='a', header=write_header, index=False)
write_header = False # Update so later chunks don't write header
示例数据:test.csv 输出:final.csv
看起来下面的代码片段解决了我的问题。感谢@aydow和@Arda Arslan给予的灵感 下面的代码只使用头名称创建file2,其余为空
column_names = ['ID', 'value1', 'value2', 'value3', 'value4']
raw_data = {column_names[0]: [],
column_names[1]: [],
column_names[2]: [],
column_names[3]: [],
column_names[4]: []}
df = pd.DataFrame(raw_data, columns = column_names)
df.to_csv("file2.csv", index=False)
下面的代码从file1一次读取一行,并将其附加到file2
for df in pd.read_csv('file1.csv', chunksize=1):
df['value3'] = 11
df['value4'] = 22
df.to_csv("file2.csv", header=False, index=False, mode='a')
更改参数chunksize的值有助于更改一次要读/写的#行。
如果您认为可以更优雅地进行改进,那么您的改进意见将非常受欢迎。下面的代码片段似乎解决了我的问题。感谢@aydow和@Arda Arslan给予的灵感 下面的代码只使用头名称创建file2,其余为空
column_names = ['ID', 'value1', 'value2', 'value3', 'value4']
raw_data = {column_names[0]: [],
column_names[1]: [],
column_names[2]: [],
column_names[3]: [],
column_names[4]: []}
df = pd.DataFrame(raw_data, columns = column_names)
df.to_csv("file2.csv", index=False)
下面的代码从file1一次读取一行,并将其附加到file2
for df in pd.read_csv('file1.csv', chunksize=1):
df['value3'] = 11
df['value4'] = 22
df.to_csv("file2.csv", header=False, index=False, mode='a')
更改参数chunksize的值有助于更改一次要读/写的#行。
如果您认为可以更优雅地进行改进,您的改进意见将非常受欢迎。pandas有非常好的工具,可以阅读各种格式的内容。看见同样地,你可以将你的数据框保存到一个csv,如果你一次只读一行,我不认为pandas是适合你的工具(可能会因为它而减速)。将打开('file.csv')作为f:…的简单
suffice@Arda阿尔斯兰,谢谢你的补充评论。性能不是我的具体情况的问题,而是记忆。熊猫也是我想使用的东西,所以它对我来说是一个很好的锻炼。熊猫有很好的工具,可以阅读各种格式的内容。看见同样地,你可以将你的数据框保存到一个csv,如果你一次只读一行,我不认为pandas是适合你的工具(可能会因为它而减速)。将打开('file.csv')作为f:…
的简单suffice@Arda阿尔斯兰,谢谢你的补充评论。表现不是我具体情况的问题,而是记忆的问题。熊猫也是我想用的东西,所以它对我来说是很好的锻炼。这太棒了!但是我需要一次读一行,然后需要一次写一行到file2。我没有在上面提到这件事是我的错。如果我读对了,你的代码就是一次读/写整个文件。我怎样才能一次读写一行?@edn,但为什么你需要一次读写一行呢?pandas的主要功能是,它允许您一次只做一行事情,相反,您可以在整个DataFrame上执行矢量化操作。我同意@Alolz的观点。我想我不明白您为什么特别想一次读一行。我明白您的观点。因为我将使用来自file1的数据来进行其他用途。上述value3和value4列将是该处理的结果。文件1是一个大文件,我不可能立即处理所有内容。。这就是为什么。。。实际上,我也可以处理5行或10行,但如果我看到如何一次处理1行,我相信以后配置它会更容易。而且至少,您应该能够在内存中容纳多行。至少你可以处理更大的文件块,也许一次几千块。这太棒了!但是我需要一次读一行,然后需要一次写一行到file2。我没有在上面提到这件事是我的错。如果我读对了,你的代码就是一次读/写整个文件。我怎样才能一次读写一行?@edn,但为什么你需要一次读写一行呢?pandas的主要功能是,它允许您一次只做一行事情,相反,您可以在整个DataFrame上执行矢量化操作。我同意@Alolz的观点。我想我不明白您为什么特别想一次读一行。我明白您的观点。因为