2017-02-02 41 views
1

我想运行一个Python代码来从一个CSV加载数据到另一个。我正在使用熊猫将数据从数据源csv加载到数据框,然后将数据框添加到最终的csv中。挑战在于此过程将每隔1分钟重复一次,并将追加到现有的csv。我不是python的专家,我的代码充其量也是如此。但在这里。Python数据框到CSV索引错误

import pandas as pd 
import csv 
import datetime 
import time 

while True: 
    df = pd.read_csv('Feed.csv') 
    df['timestamp'] = dt.datetime.now() 

    f = open('Final.csv', 'a') 
    df.to_csv(f, header = False) 
    f.close() 
time.sleep(60) 

挑战是Final.csv有一个id列正在喂食索引。并且每次代码运行时,索引都从0开始。我还必须每次都将Final.csv加载到mysql表中,并且该id将用作pk。反正有没有id自动增加每次我加载到Final.csv?

感谢

+0

你能显示什么是索引?该问题没有足够的信息作为答案 –

回答

0

您可以用以前max索引值创建的每个循环新的索引值分配,用于appendcsv是更好地使用参数mode='a'

last_idx = 0 
while True: 
    df = pd.read_csv('Feed.csv') 
    df.index = np.arange(last_idx, df.index.max() + last_idx + 1) 
    last_idx = df.index.max() + 1 
    #print (df) 

    df.to_csv('Final.csv', mode='a', header=None) 
0

您可以将一段代码添加到在你的程序中重写你的数据框。

df = pd.DataFrame({'Id':range(1,len(df)+1), 'Name':df['Name'], 'Age':df['Age'], 'Salary':df['salary']}) 

此外,可以改变在功能范围()的参数,使得Id列的初始数可以是所需的任何数目。

记住使用to_csv()函数时,设置另一个参数是假像这样:

df.to_csv(f, header = False, index = False) 
0

您可以简单地用一个计数器,并使用数据框的“索引”属性的循环设置索引:

import pandas as pd 
import csv 
import datetime 
import time 

count = 0 
while True: 
    df = pd.read_csv('Feed.csv') 
    df['timestamp'] = dt.datetime.now() 

    df.index=range(count, count+len(df)) 
    count += len(df) 
    f = open('Final.csv', 'a') 
    df.to_csv(f, header = False) 
    f.close() 
    time.sleep(60) # I assume you're missing an indent here? 

顺便说一句,为了更高效的I/O,我建议保持打开文件而不是在每个循环中打开/关闭。