繁体   English   中英

附加时如何防止 pandas.dataframe.to_csv 创建新列?

[英]How to prevent pandas.dataframe.to_csv from creating new columns when appending?

我正在按照Freddy 的示例为我的 csv 文件附加唯一值。 这是我正在使用的代码:

header = ['user.username', 'user.id']
user_filename = f"{something}_users.csv"

if os.path.isfile(user_filename): #checks if file exists
    #Read in old data
    oldFrame = pd.read_csv(user_filename, header=0)

    #Concat and drop dups
    df_diff = pd.concat([oldFrame, df[['user.username', 'user.id']]],ignore_index=True).drop_duplicates()

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

else: # else it exists so append
    df.to_csv(user_filename, columns = header, header=['username', 'user_id'], index=False, mode = 'a')

首次运行此代码会返回所需的结果:具有两个命名列(用户名和用户 ID)和各自值的 csv 文件。 如果我第二次运行它,会发生一些奇怪的事情:我仍然保留旧值和新值。 但是新值出现在两个新(未命名)列中的旧值下方,如下所示:

username    user_id
user1       123
user2       456
                     user3     789
                     user4     124    

我正在寻找的输出是这样的:

username    user_id
user1       123
user2       456
user3       789
user4       124    

代码的主要问题是命名约定。 试试这段代码

header = ['user.username', 'user.user_id']
user_filename = "users.csv"

if os.path.isfile(user_filename): #checks if file exists
    #Read in old data
    oldFrame = pd.read_csv(user_filename, header=0)
    
    #Concat and drop dups
    concat = pd.concat([oldFrame, df[['user.username', 'user.user_id']]], ignore_index=True)
    df_diff = concat.drop_duplicates()
    
    
    #Write new rows to csv file
    df_diff.to_csv(user_filename, header=['user.username', 'user.user_id'], index=False)

else: # else it exists so append
    df.to_csv(user_filename, columns = header, header=['user.username', 'user.user_id'], index=False, mode='a')

这段代码的不同之处在于,您从文件中读取的标头名称应该与您尝试连接数据的标头名称相同。 如果您不想更改列名,可以使用一些临时字典来实现此目的。

该问题是由连接具有不同列名的两个数据帧引起的。 导入的数据框已经有新的列名( 'username''user_id' ),数据'user.username' df仍然使用'user.username''user.id'

为了避免错误,我改变了这一行

df_diff = pd.concat([oldFrame, df[['user.username', 'user.id']]],ignore_index=True).drop_duplicates()

df_diff = pd.concat([oldFrame, df[['user.username', 'user.id']].rename(columns={"user.username": "username", "user.id": "user_id"})],ignore_index=True).drop_duplicates()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM