满足条件时如何更改数据框中的单个值?

时间:2019-05-09 08:13:37

标签: python pandas dataframe

据我所知,我目前在熊猫数据框中更改值的方法远非最优,并且确实伤害了我的工作流程。

示例: 我想检查是否在另一个数据框内找到了一个名称,如果要查找,请将该数据框的值放到从第一个数据框搜索的名称的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”。

2 个答案:

答案 0 :(得分:0)

为什么不合并Name上的两个数据框,然后应用自定义函数来创建列final_value,该列在valuevalue_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)