我有一个包含名称的Pandas数据框:
Names
Matthew
Mark
Luke
John
我还有大约10个包含更多数据的文件,并且还有一个名称列,其中一个文件是:
Names Sum Random_data
Matthew 200 x
James 400 y
some_guy 150 x
Wilson 500 y
而另一个文件可以:
Names Sum Random_data
Luke 800 x
Bart 700 y
Sean 250 x
TOast 100 y
我希望将10个文件中每个文件的“Sum”列的值合并到第一个文件中的相对行作为新列。我想这可以通过遍历我想要搜索正确的'Name'行的所有文件然后在两个文件上作为数据帧执行合并来完成:
for data_file in all_files_that_have_data:
data_df = pd.read_csv(data_file)
df = df.merge(data_df, on='Name', how='left', suffixes=['','_remove'])
cols = [c for c in df.columns if '_remove' not in c]
df = df[cols]
print(df.columns)
我的问题是,每次执行合并时,如何在不覆盖数据的情况下执行此操作。 Name的正确数据可以在一个文件中,但在与下一个文件合并时会丢失。是否有办法有条件地合并每个文件,但只有在左数据帧行的当前值为NaN时才覆盖?
答案 0 :(得分:2)
假设您只从csv文件中获取唯一值,为什么不创建包含csv文件中所有值然后合并的单个数据框?
data_df = pd.DataFrame()
for data_file in all_files_that_have_data:
data_df_temp = pd.read_csv(cpc_file)
data_df = data_df.append(data_df_temp)
df = df.merge(data_df, on='Names', how='left')
print(df.columns)
答案 1 :(得分:0)
#create list of all DataFrames from csvs
dfs = [pd.read_csv(fp) for fp in all_files_that_have_data]
#concanecate them together
df_all = pd.concat(dfs, ignore_index=True)
#left join
df = pd.merge(df, df_all, how='left')
#alternatively
#df = df.join(df_all.set_index('Names'), on='Names')
print (df)
Names Sum Random_data
0 Matthew 200.0 x
1 Mark NaN NaN
2 Luke 800.0 x
3 John NaN NaN