【问题标题】:Perform a conditional operation on a pandas column对 pandas 列执行条件操作
【发布时间】:2018-11-28 16:02:08
【问题描述】:

我知道这应该很简单,但我想从 pandas 中获取一列 数据框,并且仅适用于满足某些条件(例如小于 1)的条目, 乘以一个标量(比如 2)。

例如,在这个数据框中,

df = pd.DataFrame(randn(5,4),index='A B C D E'.split(),columns='W X Y Z'.split())

          W         X       Y        Z  

A    2.706850 0.628133 0.907969 0.503826 
B    0.651118 -0.319318 -0.848077 0.605965 
C    -2.018168 0.740122 0.528813 -0.589001 
D    0.188695 -0.758872 -0.933237 0.955057 
E    0.190794 1.978757 2.605967 0.683509 

如果我有兴趣对列 W 执行此操作,结果应该是

          W         X       Y        Z  

A    2.706850 0.628133 0.907969 0.503826 
B    1.302236 -0.319318 -0.848077 0.605965 
C    -4.036336 0.740122 0.528813 -0.589001 
D    0.37739 -0.758872 -0.933237 0.955057 
E    0.381588 1.978757 2.605967 0.683509

我有以下绝对分配:

df.loc[df['W'] < 1, 'W'] = 4

但我不确定如何使用来自W 的实际值。

提前致谢!

【问题讨论】:

标签: python pandas dataframe


【解决方案1】:

在您的情况下,只需使用 *= 运算符即可进行乘法运算:

如果您的原始数据框如下所示:

>>> df
          W         X         Y         Z
0  2.706850  0.628133  0.907969  0.503826
1  0.651118 -0.319318 -0.848077  0.605965
2 -2.018168  0.740122  0.528813 -0.589001
3  0.188695 -0.758872 -0.933237  0.955057
4  0.190794  1.978757  2.605967  0.683509

你可以使用:

df.loc[df['W'] < 1, 'W'] *= 2

导致:

>>> df
          W         X         Y         Z
0  2.706850  0.628133  0.907969  0.503826
1  1.302236 -0.319318 -0.848077  0.605965
2 -4.036336  0.740122  0.528813 -0.589001
3  0.377390 -0.758872 -0.933237  0.955057
4  0.381588  1.978757  2.605967  0.683509

这等价于:

df.loc[df['W'] < 1, 'W'] = df.loc[df['W'] < 1, 'W'] * 2

【讨论】:

  • 有趣的是,即使df.loc[df['W'] &lt; 1, 'W'] = df['W'] * 2 也有效。
  • @unutbu,是的,这是我从未完全掌握的东西。有时您需要在左侧和右侧应用遮罩,有时则不需要。
  • 它是索引的交集。
【解决方案2】:

你也可以使用numpy.where:

df['W'] = numpy.where(df['W'] < 1, df['W'] * 2, df['W'])

它会检查您的情况并应用相关操作。

【讨论】:

  • df.W *= np.where(df.W &lt; 1, 2, 1)
猜你喜欢
  • 2021-03-20
  • 1970-01-01
  • 2022-01-07
  • 2021-06-07
  • 2017-03-17
  • 2018-06-14
  • 1970-01-01
  • 2021-09-17
  • 2016-08-03
相关资源
最近更新 更多