繁体   English   中英

多个系列与另一个系列的条件乘法

[英]Conditional multiplication of multiple series with another series

我想根据第三列中的条件,将DataFrame的一列中的值乘以另一列中的值。 例如:

data = pd.DataFrame({'a': [1, 33, 56, 79, 2], 'b': [9, 12, 14, 5, 5], 'c': np.arange(5)})
data.loc[data.a > 10, ['a', 'b']] *= data.loc[data.a > 10, 'c']

我想要做的是根据条件将'a'和'b'的值乘以'c'中的相应(相同行)值。 但是,上述代码只会导致NaN值在所需范围内。

我发现最接近的解决方法是这样做:

data.loc[data.a > 10, ['a', 'b']] = (data.loc[data.a > 10, ['a', 'b']].as_matrix().T * data.loc[data.a > 10, 'c']).T

这有效,但似乎有一种更好的(更多的Pythonic)方式,我错过了。

你可以使用mul(...,axis = 0)方法:

In [122]: mask = data.a > 10

In [125]: data.loc[mask, ['a','b']] = data.loc[mask, ['a','b']].mul(data.loc[mask, 'c'], 0)


In [126]: data
Out[126]:
     a   b  c
0    1   9  0
1   33  12  1
2  112  28  2
3  237  15  3
4    2   5  4

以下是使用Series.where()有条件地更新值的一种替代方法:

data[['a', 'b']] = data[['a', 'b']].apply(lambda m: m.where(data.a <= 10, m*data.c))

在此输入图像描述

使用update

data.update(data.query('a > 10')[['a', 'b']].mul(data.query('a > 10').c, 0))

data

在此输入图像描述

好吧,NumPy似乎可以成为另类 -

arr = data.values
mask = arr[:,0] > 10
arr[mask,:2] *= arr[mask,2,None]

我们只是将values提取为数组,这是一个数据框视图,它允许我们处理数组,更新将自动反映在数据框中。 这是一个示例运行以显示进度 -

In [507]: data  # Input dataframe
Out[507]: 
    a   b  c
0   1   9  0
1  33  12  1
2  56  14  2
3  79   5  3
4   2   5  4

使用建议的代码 -

In [508]: arr = data.values

In [509]: mask = arr[:,0] > 10

In [510]: arr[mask,:2] *= arr[mask,2,None]

使用数据框验证结果 -

In [511]: data
Out[511]: 
     a   b  c
0    1   9  0
1   33  12  1
2  112  28  2
3  237  15  3
4    2   5  4

让我们尝试通过其他方式验证我们确实在那里工作 -

In [512]: np.may_share_memory(data,arr)
Out[512]: True
# %%
import pandas as pd
import numpy as np 

data = pd.DataFrame({'a': [1, 33, 56, 79, 2], 
                     'b': [9, 12, 14, 5, 5], 
                     'c': np.arange(5)})

(data.loc[data.a>10, ['a','b']]\
 .T * data.loc[data.a>10, 'c'])\
 .T.append(data.loc[data.a<=10, ['a','b']])\
 .T.append(data.c).T.sort()
# %%

Out[17]: 
     a   b  c
0    1   9  0
1   33  12  1
2  112  28  2
3  237  15  3
4    2   5  4

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM