[英]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.