如何使用熊猫读取csv,追加新数据以及写入新csv

时间:2018-07-11 02:05:56

标签: python pandas csv dataframe

我以前没有使用过Pandas,看起来我需要一些初步帮助。我在任何地方都找不到这个特定示例。

我有一个csv文件,如下所示为file1.csv:

ID     value1     value2
1       100        200
2       101        201

我需要一次从file1.csv中读取1行,追加2个新的列信息/数据,然后将所有内容写入一个名为file2.csv的新文件中。 file2.csv应该如下所示:

ID     value1     value2     value3     value4
1       100        200        10         20
2       101        201        11         21

任何人都可以指导或给出一个简短的示例来说明如何执行此操作(读取file1,附加新数据(value3和value4列)并将其写入file2)吗?

附录: 我需要一次从file1读取1行,并一次向file2写入1行。

4 个答案:

答案 0 :(得分:3)

以下内容将加载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

file2.csv的内容:

,ID,value1,value2,value3,value4
0,1,100,200,10,20
1,2,101,201,11,21

答案 1 :(得分:2)

使用read_csvto_csv。在index中使用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

答案 2 :(得分:1)

尽管通常有更好的解决方案,例如使用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

val1,val2
1,2
3,4
5,6
7,8
9,10
11,12
13,14
15,16

输出:final.csv

val1,val2,val3,val4
1,2,1,8
3,4,9,16
5,6,25,24
7,8,49,32
9,10,81,40
11,12,121,48
13,14,169,56
15,16,225,64

答案 3 :(得分:1)

看起来像下面的代码片段正在解决我的问题。感谢@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读取1行并将其附加到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 的值有助于更改您想一次读取/写入的#行。 如果您认为可以更优雅地进行改进,那么欢迎您提出改进意见。