是否可以在pandas数据框中基于不同列中的尾随行进行计算?像这样的东西。

frame = pd.DataFrame({'a' : [True, False, True, False],
                  'b' : [25, 22, 55, 35]})

我希望输出如下:
A     B     C
True  25
False 22   44
True  55   55
False 35   70

其中,当列A中的尾随行为False时,列C与列B相同;当列A中的尾随行为True时,列C为列B*2?

最佳答案

您可以使用where系列方法:

In [11]: frame['b'].where(frame['a'], 2 * frame['b'])
Out[11]:
0    25
1    44
2    55
3    70
Name: b, dtype: int64

In [12]: frame['c'] = frame['b'].where(frame['a'], 2 * frame['b'])

或者您可以使用apply(但这通常会比较慢):
In [21]: frame.apply(lambda x: 2 * x['b'] if x['a'] else x['b'], axis=1

因为您使用的是“尾随行”,所以需要使用shift
In [31]: frame['a'].shift()
Out[31]:
0      NaN
1     True
2    False
3     True
Name: a, dtype: object

In [32]: frame['a'].shift().fillna(False)  # actually this is not needed, but perhaps clearer
Out[32]:
0    False
1     True
2    False
3     True
Name: a, dtype: object

用另一种方法:
In [33]: c = (2 * frame['b']).where(frame['a'].shift().fillna(False), frame['b'])

In [34]: c
Out[34]:
0    25
1    44
2    55
3    70
Name: b, dtype: int64

以及更改第一行(例如,改为NaN,in pandas we use NaN for missing data
In [35]: c = c.astype(np.float)  # needs to accept NaN

In [36]: c.iloc[0] = np.nan

In [36]: frame['c'] = c

In [37]: frame
Out[37]:
       a   b   c
0   True  25 NaN
1  False  22  44
2   True  55  55
3  False  35  70

关于python - 在 Pandas 数据框中基于尾随行进行计算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17966315/

10-11 06:56