下面是我的pandas代码,当我们groupby over mask only masked row得到正确的转换值。但是,我希望填充value_transform中的所有单元格。有办法吗?见下文预期产出
import pandas as pd
data = {
'dates': ['2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03', '2023-01-01', '2023-01-02', '2023-01-03'],
'flag': [True, True, False, False, False, True, True, False, True],
'value': [10, 10, 20, 30, 40, 50, 50, 50, 60],
}
df = pd.DataFrame(data)
mask = df['flag'] == True
df['value_transform'] = df[mask].groupby('dates')['value'].transform(lambda x: max(x) - min(x))
ExpecteD:
dates flag value value_transform
0 2023-01-01 True 10 40.0
1 2023-01-02 True 10 0.0
2 2023-01-03 False 20 10.0
3 2023-01-01 False 30 40.0
4 2023-01-02 False 40 0.0
5 2023-01-03 True 50 10.0
6 2023-01-01 True 50 40.0
7 2023-01-02 False 50 0.0
8 2023-01-03 True 60 10.0
4条答案
按热度按时间bakd9h0s1#
lvjbypge2#
使用flag列在value列上运行where子句,执行groupby,计算分组对象的最小值和最大值,并将结果赋回原始的对象框:
6mw9ycah3#
IIUC中,你想根据日期在
value_transform
中填充nans,最简单的方法是排序,然后bfill
。代码如下:
输出量:
u3r8eeie4#
如果不能依赖于返回结果的顺序,可以计算聚合视图并使用
Series.map
创建新列(请注意,这实际上是reduction
+{merge,join}
: