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