【问题标题】:Add only new rows to existing csv using pandas?使用熊猫仅向现有 csv 添加新行?
【发布时间】:2020-02-20 19:41:19
【问题描述】:

好的,我不知道如何正确编程。尝试了很多组合,但由于逻辑错误,我已经走到了死胡同。我设法从网络上获取数据,并使用 pandas 将这些数据放在一个 csv 文件中。该脚本将每 15 分钟运行一次以获取数据。

在下面的这种情况下,我创建了一个名为“数据”的虚拟对象。 如果有新的更新可用,数据有时会有所不同,有时会根据提供商所做的更改而看起来相同。

但是,如果我再次运行脚本,它只会用相同的数据填充 csv 文件。这是我不想要的,但我只想添加行,如果有新的唯一数据则追加。

举个例子

import os
import requests
import pandas as pd
from datetime import datetime
import html5lib
import csv

data = [('Peter', 18, 7), ('Dick',22,2),
                        ('Riff', 15, 6), 
                        ('John', 17, 8), 
                        ('Michel', 18, 7), 
                        ('Sheli', 17, 5) ]
df = pd.DataFrame(data)

# if file exists....
if os.path.isfile('filename.csv'):
    #Old data
    oldFrame = pd.read_csv('filename.csv')
    
    #Concat
    df_diff = pd.concat([oldFrame, df],ignore_index=True).drop_duplicates(keep=False)

    #Write new rows to csv file
    df_diff.to_csv('filename.csv', mode='a', header=False)
    
else: # else it exists so append
    df.to_csv('filename.csv')

但是这不起作用并且给了我错误的数据,所以逻辑是错误的。怎么做才能达到我想要的?有没有更好的方法可以使用?

更新

在好人的帮助下改成这样的脚本...

import os
import requests
import pandas as pd
from datetime import datetime
import html5lib
import csv

data = [('Adam', 18, 7), ('Magnus',22,2),('Lena',22,2),('Gringo', 18, 7)]
df = pd.DataFrame(data)
##
### if file exists....
if os.path.isfile('filename.csv'):
    #Old data
    oldFrame = pd.read_csv('filename.csv', header=None)
    
    #Concat
    df_diff = pd.concat([oldFrame, df], ignore_index=True).drop_duplicates()

    #Write new rows to csv file
    df_diff.to_csv('filename.csv', header=False)
    
else:

    # else it exists so append
    df.to_csv('filename.csv')
    print("File Created...")

多次使用相同的“数据”值运行脚本...... 但是数据帧的输出看起来像这样(如果调用 oldFrame)

>>> oldFrame
     0       1       2       3       4     5    6
0    0       0       0     NaN       0   1.0  2.0
1    1       1       1     0.0    Adam  18.0  7.0
2    2       2       2     1.0  Magnus  22.0  2.0
3    3       3       3     2.0    Lena  22.0  2.0
4    4       4       4     3.0  Gringo  18.0  7.0
5    5       5       5    Adam      18   7.0  NaN
6    6       6       6  Magnus      22   2.0  NaN
7    7       7       7    Lena      22   2.0  NaN
8    8       8       8  Gringo      18   7.0  NaN
9    9       9    Adam      18       7   NaN  NaN
10  10      10  Magnus      22       2   NaN  NaN
11  11      11    Lena      22       2   NaN  NaN
12  12      12  Gringo      18       7   NaN  NaN
13  13    Adam      18       7     NaN   NaN  NaN
14  14  Magnus      22       2     NaN   NaN  NaN
15  15    Lena      22       2     NaN   NaN  NaN
16  16  Gringo      18       7     NaN   NaN  NaN

由于数据相同,不应该更改csv吗?

【问题讨论】:

  • 如果您已经将旧数据连接到新数据,为什么还需要附加到 csv?旧数据会出现两次
  • Trigonom - 你说得有道理。但是如何比较新数据和旧数据呢?

标签: python-3.x pandas csv


【解决方案1】:

读取现有文件时,将第一行作为标题。

由于您没有使用标题,请指定不阅读它

替换

oldFrame = pd.read_csv('filename.csv')

通过

oldFrame = pd.read_csv('filename.csv', header=None)


另外,删除keep=Falsedrop_duplicates

df_diff = pd.concat([oldFrame, df],ignore_index=True).drop_duplicates()

mode='a'to_csv

df_diff.to_csv('filename.csv', header=False)

更新

注意我编辑了两个 to_csv 调用

最终脚本

import os
import requests
import pandas as pd
from datetime import datetime
import csv

data = [('Peter', 18, 7), ('Dick',22,2),
                        ('Riff', 15, 6), 
                        ('John', 17, 8), 
                        ('Michel', 18, 7), 
                        ('NEW', 2, 5), 
                        ('other', 2, 5), 
                        ('Sheli', 17, 5) ]
df = pd.DataFrame(data)

# if file exists....
if os.path.isfile('filename.csv'):
    #Old data
    oldFrame = pd.read_csv('filename.csv', header=None)

    #Concat
    df_diff = pd.concat([oldFrame, df],ignore_index=True).drop_duplicates()

    #Write new rows to csv file
    df_diff.to_csv('filename.csv', header=False, index=False)

else: # else it exists so append
    df.to_csv('filename.csv', header=False, index=False)

【讨论】:

猜你喜欢
  • 2019-11-12
  • 1970-01-01
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2018-03-09
  • 1970-01-01
相关资源
最近更新 更多