Pandas:如果条件[重复],则从另一列更新列值

Posted

技术标签:

【中文标题】Pandas:如果条件[重复],则从另一列更新列值【英文标题】:Pandas: update column values from another column if criteria [duplicate] 【发布时间】:2019-01-18 02:42:48 【问题描述】:

我有一个数据框:

   A B

1: 0 1
2: 0 0 
3: 1 1
4: 0 1
5: 1 0

如果 column A 中的值等于 0,我想用 column B 的值更新 DataFrame 的每个项目 column A。 p>

我要获取的DataFrame:

   A B

1: 1 1
2: 0 0 
3: 1 1
4: 1 1
5: 1 0

我已经尝试过这段代码

df['A'] = df['B'].apply(lambda x: x if df['A'] == 0 else df['A'])

它会引发错误:The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

【问题讨论】:

【参考方案1】:

使用where

In [348]: df.A = np.where(df.A.eq(0), df.B, df.A)

In [349]: df
Out[349]:
    A  B
1:  1  1
2:  0  0
3:  1  1
4:  1  1
5:  1  0

【讨论】:

哪种解决方案在时间上更有效,你的还是 Rusabh 的?【参考方案2】:
df['A'] = df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)

输出

    A  B
1:  1  1
2:  0  0
3:  1  1
4:  1  1
5:  1  0

【讨论】:

【参考方案3】:

您可以使用掩码来执行此操作:

df = pd.DataFrame()
df['A'] = [0,0,1,0,1]
df['B'] = [1,0,1,1,0]
mask = (df.A == 0)
df.loc[mask,'A'] = df.loc[mask,'B']

    A   B
0   1   1
1   0   0
2   1   1
3   1   1
4   1   0

编辑: 好的,这实际上是一个低效的解决方案:

%timeit df.loc[mask,'A'] = df.loc[mask,'B']
%timeit df.apply(lambda x: x['B'] if x['A']==0 else x['A'], axis=1)
%timeit np.where(df.A.eq(0), df.B, df.A)

5.52 ms ± 556 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
1.27 ms ± 167 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
796 µs ± 89.2 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

感谢零使用 np.where 提供的这种高效解决方案!

【讨论】:

以上是关于Pandas:如果条件[重复],则从另一列更新列值的主要内容,如果未能解决你的问题,请参考以下文章

如何在条件中将一列值替换为另一列值[重复]

mysql如何根据一列值更新另一列的值?

PySpark DataFrame 根据另一列中时间戳值的最小/最大条件更新列值

计算由另一列值分组的列值在 pandas 数据框中的共现

从pandas DataFrame中另一列中的位置给定的字符串列中提取字符[重复]

Pandas - 基于 str 包含从另一列创建新列/值