Python 如何防止pandas.dataframe.to_csv在追加时创建新列?

Python 如何防止pandas.dataframe.to_csv在追加时创建新列?,python,pandas,Python,Pandas,我下面的例子是用唯一的值附加我的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, head

我下面的例子是用唯一的值附加我的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')
第一次运行此代码将返回所需的结果:一个csv文件,其中包含两个命名列(username和user_id)和相应的值。如果我再次运行它,会发生一些奇怪的事情:我仍然保留旧值和新值。但新值显示在两个新(未命名)列中旧值的下方,如下所示:

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\u id'
),数据框
df
仍然使用
'user.username'
'user.id'

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

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


如何在没有更多信息的情况下进行猜测,但我假设标题中的字段具有不同的名称,因此
pd.concat
操作会创建不同的列。
df_diff = pd.concat([oldFrame, df[['user.username', 'user.id']].rename(columns={"user.username": "username", "user.id": "user_id"})],ignore_index=True).drop_duplicates()