Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何使用pandas读取csv、附加新数据和写入新csv_Python_Pandas_Csv_Dataframe - Fatal编程技术网

Python 如何使用pandas读取csv、附加新数据和写入新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

我以前从未使用过熊猫,看起来我需要一些初始帮助。我在任何地方都找不到这个具体的例子

我有一个csv文件,比如file1.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
我需要从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的观点。我想我不明白您为什么特别想一次读一行。我明白您的观点。因为