据我所知,我目前在熊猫数据框中更改值的方法远非最优,并且确实伤害了我的工作流程。
示例: 我想检查是否在另一个数据框内找到了一个名称,如果要查找,请将该数据框的值放到从第一个数据框搜索的名称的iloc中:
for idx in id_list_of_names:
name = df["name"].iloc[idx]
if name in df_two["name"].values:
df["value"].iloc[idx] = df_two["value"][df_two["name"]==name].values
数据框1,df
:
id | name | value
1 | "David" | 0
2 | "Lisa" | 0
...............
数据框2,df_two
:
id | name | value
1 | "Kevin" | 10
.................
255 | "David" | 22
.................
我想做的是将来自df_two
的David(value = 22
)的值放在数据帧1中,位于David(df["value"].iloc[1] == 22
)的iloc上。如果df
中存在相应的名称,则df_two
中的所有名称都应该发生这种情况。
merge()
是我通常的解决方案,但是如果在这种情况下使用merge
,则由于“值”列已经存在,因此将创建新的列“值_1”。
答案 0 :(得分:0)
为什么不合并Name上的两个数据框,然后应用自定义函数来创建列final_value
,该列在value
和value_1
之间进行选择?
答案 1 :(得分:0)
使用merge
将两个数据帧合并在一起,同时将df
作为主要数据帧(左合并)。如您所述,由于列名相同,所以将为其赋予新名称(添加_x
和_y
后缀)。
首先从id
中删除df_two
列,然后合并:
df_two = df_two.drop('id', axis=1)
df = df.merge(df_two, on='name', how='left')
现在,在有可用值时使用value
创建一个新列value_y
,否则使用value_x
:
df['value'] = df['value_y'].fillna(df['value_x'])
最后,删除不需要的列:
df = df.drop(['value_x', 'value_y'], axis=1)