【问题标题】:Pandas. Apply function to create multiple columns based on mask熊猫。应用函数以基于掩码创建多个列
【发布时间】:2021-07-06 19:57:09
【问题描述】:

我正在尝试将自定义函数应用于将返回 3 个现有列的 3 个值的列。但我只需要对按掩码过滤的行执行此操作。
所以,例如我有一个函数

def f(x):
  return pd.Series(["1", "2", "3"])

我有一个数据框

pd.DataFrame({'A':[1,2,3],'B':[1,2,3],'C':[1,2,3],'X':[1,10,100]})

因此,任务是仅在 df['X']==10 时将函数 f() 应用于数据帧,并相应地使用函数更新 df[['A','B','C']] 中的值返回。

我期望看到的:

    A   B   C   X
0   1   1   1   1
1  "1" "2" "3"  10
2   3   3   3  100

到目前为止我做了什么:

mask = df['X']==10
df[['A','B','C']] = np.where(mask, df['X'].apply(f), df[['A','B','C']] ))  

但是我收到了关于 operands could not be broadcast together with shapes.. 的错误消息。

感谢任何帮助。

【问题讨论】:

  • 您能否用您的示例发布所需的解决方案?

标签: python pandas apply


【解决方案1】:

您需要使用mask 来更新值:

df.loc[mask, ['A', 'B', 'C']] = df.loc[mask] \
                                  .apply(f, axis='columns') \
                                  .values
>>> df
   A  B  C    X
0  1  1  1    1
1  1  2  3   10
2  3  3  3  100

【讨论】:

  • 可以用 np.where 制作吗?数据集很大,.loc 很慢..
  • 另外,您正在将函数应用于 [['A', 'B', 'C']],但应该应用于系列 df['X']
  • 我收到错误消息。但以下工作:df.loc[mask, ['A', 'B', 'C']] = df.loc[mask, ['X']].apply(f).T.values
猜你喜欢
  • 2013-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-16
  • 2021-08-27
  • 1970-01-01
  • 2013-02-13
  • 1970-01-01
相关资源
最近更新 更多