我有一個這樣的df:
| 月 | 股票 | MV |
|---|---|---|
| 1994-07 | 一種 | 50 |
| 1994-07 | 乙 | 60 |
| 1994-07 | C | 70 |
| 1994-07 | D | 80 |
| 1994-08 | 一種 | 90 |
| 1994-08 | 乙 | 60 |
| 1994-08 | C | 70 |
| 1994-08 | D | 95 |
| 1994-08 | 乙 | 100 |
| 1994-08 | F | 110 |
我想以每月只有最高 MV 的 50% 的方式對我的 df 進行子集化。對于 1994 年 7 月,我只有 4 個股票,所以 50% 將是 2 個最高 MV。之后的一個月,我有 6 只股票,這給了我 3 個最高值:
| 月 | 股票 | MV |
|---|---|---|
| 1994-07 | C | 70 |
| 1994-07 | D | 80 |
| 1994-08 | D | 95 |
| 1994-08 | 乙 | 100 |
| 1994-08 | F | 110 |
我努力了:
df = df.groupby(pd.Grouper(freq="M")).nlargest(2, "MV")
但我得到了錯誤: AttributeError: 'DataFrameGroupBy' object has no attribute 'nlargest' 此外,n 的值每個月都需要是不同的值。我也不確定如何處理。
uj5u.com熱心網友回復:
您需要使用apply并計算最終長度:
df.groupby(pd.Grouper(freq="M")).apply(lambda g: g.nlargest(len(g)//2, 'MV'))
將提供的資料作為字串:
(df.groupby('month', as_index=False, group_keys=False) # use pd.Grouper if needed here
.apply(lambda g: g.nlargest(len(g)//2, 'MV'))
.sort_values(by=['month', 'MV'])
)
輸出:
month stock MV
2 1994-07 C 70
3 1994-07 D 80
7 1994-08 D 95
8 1994-08 E 100
9 1994-08 F 110
uj5u.com熱心網友回復:
您可以對值進行排序,然后在 lambda 函式中選擇 50% 的值長度:
df = (df.sort_values(['month','MV'])
.groupby(pd.Grouper(freq="M"), group_keys=False)
.apply(lambda x: x.head(int(len(x)) // 2)))
uj5u.com熱心網友回復:
你需要通過apply
df = df.groupby(pd.Grouper(freq="M")).apply(lambda x : x.nlargest(2, "MV"))
uj5u.com熱心網友回復:
df.groupby('month').apply(lambda monthly_data: monthly_data[monthly_data['MV'] >= monthly_data['MV'].median())
uj5u.com熱心網友回復:
您可以使用median(或quantile):
out = df.loc[df['MV'] > df.groupby('month')['MV'].transform('median')]
print(out)
# Output
month stock MV
2 1994-07 C 70
3 1994-07 D 80
7 1994-08 D 95
8 1994-08 E 100
9 1994-08 F 110
相同的版本,quantile但如果你想改變百分比,你有更多的控制權:
out = df.loc[df['MV'] > df.groupby('month')['MV'].transform('quantile', 0.5)]
print(out)
# Output
month stock MV
2 1994-07 C 70
3 1994-07 D 80
7 1994-08 D 95
8 1994-08 E 100
9 1994-08 F 110
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443625.html
標籤:Python 熊猫 熊猫-groupby 分组 子集
