【问题标题】:Filtering of values within a column based on the dates in another column根据另一列中的日期过滤列中的值
【发布时间】:2021-06-16 13:22:59
【问题描述】:
大家好,我有一个带有日期和值列的 pandas 数据框。
我要做的是根据下表的不同日期将值保持在 25% 和 75% 分位数内。有没有办法做到这一点?
| Date |
Values |
| 2020-1-23 |
455.0 |
| 2020-1-25 |
428.0 |
| 2020-1-25 |
379.0 |
| 2020-1-25 |
386.0 |
| 2020-1-26 |
385.0 |
| 2020-1-26 |
476.0 |
| 2020-1-26 |
427.0 |
| 2020-1-26 |
399.0 |
| 2020-1-26 |
374.0 |
| 2020-1-26 |
419.0 |
【问题讨论】:
标签:
python-3.x
pandas
quantile
percentile
【解决方案1】:
将GroupBy.transform 与 lambda 函数一起使用并传递给Series.between 以在boolean indexing 中进行过滤:
g = df.groupby('Date')['Values']
s1 = g.transform(lambda x: x.quantile(0.25))
s2 = g.transform(lambda x: x.quantile(0.75))
df = df[df['Values'].between(s1, s2)]
print (df)
Date Values
0 2020-1-23 455.0
3 2020-1-25 386.0
7 2020-1-26 399.0
9 2020-1-26 419.0
或将DataFrameGroupBy.quantile 与DataFrame.join 一起使用:
df1 = df.join(df.groupby('Date')['Values'].quantile([0.25,0.75]).unstack(), on='Date')
df = df[df['Values'].between(df1[0.25], df1[0.75])]
print (df)
Date Values
0 2020-1-23 455.0
3 2020-1-25 386.0
7 2020-1-26 399.0
9 2020-1-26 419.0