组别:应用量化替换

问题描述 投票:0回答:1

我试图使用python的groupby、apply、where和quantile来替换那些低于50%分位数的值,用'date'组来替换NaN,但是它似乎在单元格中返回列表。我如何才能在 "value "列后的新列中得到这些结果。

这是我的代码(欢迎任何其他方法)。它在单元格中返回列表。

In[0]: df.groupby('date')['value'].apply(lambda x: np.where(x<x.quantile(0.5),np.nan,x))  
Out[0]:                            
date                            value     
2019-12-23  [nan, nan, 3.0, 4.0, 5.0]
2014-08-13  [nan, nan, 3.0, 4.0, 5.0]

如果我创建了一个新的列,它就会在新列中返回NaN。

In[1]: df['new_value']= df.groupby('date')['value'].apply(lambda x: np.where(x<x.quantile(0.5),np.nan,x))
Out[1]: 
        date  value    new_value
0 2019-12-23      1.0       NaN
1 2019-12-23      2.0       NaN
2 2019-12-23      3.0       NaN
3 2019-12-23      4.0       NaN
4 2019-12-23      5.0       NaN
5 2014-08-13      1.0       NaN
6 2014-08-13      2.0       NaN
7 2014-08-13      3.0       NaN
8 2014-08-13      4.0       NaN
9 2014-08-13      5.0       NaN

我想解决这个问题。

        date     value    new_value
0 2019-12-23      1.0        NaN
1 2019-12-23      2.0        NaN
2 2019-12-23      3.0        3.0
3 2019-12-23      4.0        4.0
4 2019-12-23      5.0        5.0
5 2014-08-13      1.0        NaN
6 2014-08-13      2.0        NaN
7 2014-08-13      3.0        3.0
8 2014-08-13      4.0        4.0
9 2014-08-13      5.0        5.0
python pandas pandas-groupby quantile pandas-apply
1个回答
1
投票

取而代之的是 apply 你可以用 transform

df["new_value"] = df.groupby("date")["value"].transform(
    lambda x: np.where(x < x.quantile(0.5), np.nan, x)
)


    date    value   new_value
0   2019-12-23  1.0     NaN
1   2019-12-23  2.0     NaN
2   2019-12-23  3.0     3.0
3   2019-12-23  4.0     4.0
4   2019-12-23  5.0     5.0
5   2014-08-13  1.0     NaN
6   2014-08-13  2.0     NaN
7   2014-08-13  3.0     3.0
8   2014-08-13  4.0     4.0
9   2014-08-13  5.0     5.0
© www.soinside.com 2019 - 2024. All rights reserved.