[英]pandas: how to select first or last by column in keep with drop_duplicates
[英]Pandas - Drop duplicates but change keep:first/last according to a value in a column
我試圖為星期一的每個唯一日期保留第一行,但為星期五的每個唯一日期保留最后一行。
我嘗試添加一個指標列,其中星期一 = 1 和星期五 = 2。
我似乎無法弄清楚解決這個問題的最佳方法是什么? 我嘗試使用drop_duplicates
但我只知道如何使用它來選擇將檢查重復項的列,但我無法弄清楚如何根據每一行中“Day”的值在first
和last
之間切換keep
。
year month day Time Close Date Day %Delta MFIndicator
2926 2001 1 5 0 0.9525 2001-01-05 Friday -0.000734 2
2985 2001 1 5 1 0.9534 2001-01-05 Friday 0.000945 2
3045 2001 1 5 2 0.9534 2001-01-05 Friday 0.000000 2
3105 2001 1 5 3 0.9541 2001-01-05 Friday 0.000734 2
3165 2001 1 5 4 0.9574 2001-01-05 Friday 0.003459 2
... ... ... ... ... ... ... ... ... ...
6700166 2019 12 30 19 1.1200 2019-12-30 Monday -0.000179 1
6700226 2019 12 30 20 1.1195 2019-12-30 Monday -0.000446 1
6700286 2019 12 30 21 1.1198 2019-12-30 Monday 0.000268 1
6700346 2019 12 30 22 1.1197 2019-12-30 Monday -0.000089 1
6700406 2019 12 30 23 1.1200 2019-12-30 Monday 0.000268 1
這是預期的結果:(XXXX,YYYY 是一些索引,但我認為圖片很清楚)
year month day Time Close Date Day %Delta MFIndicator
XXXX 2001 1 5 23 0.9574 2001-01-05 Friday 0.003459 2
... ... ... ... ... ... ... ... ... ...
YYYY 2019 12 30 0 0.1200 2019-12-30 Monday -0.000179 1
df = pd.DataFrame({'A': ['m', 'f', 'm', 'm', 'f', 'f'],
'B': np.arange(6), 'C': np.arange(6)})
A B C
0 m 0 0
1 f 1 1
2 m 2 2
3 m 3 3
4 f 4 4
5 f 5 5
(df.groupby('A', as_index=False).apply(lambda x: x.iloc[[0]] if x['A'].values[0]=='m' else x.iloc[[-1]])
.reset_index(level=0, drop=True))
A B C
4 f 4 4
0 m 0 0
邏輯將是相同的。 在 A 的位置,您將擁有 Day 列,並且您將進行 groupby Date 列。
保留所有,然后在 groupby 中進行后處理,有點像這樣:
dup_mask = df.duplicated(subset=['Date'], keep=False)
df_dup = df[dup_mask].groupby('Date', as_index=False).apply(lambda gr: gr.iloc[0] if gr['Day'].iloc[0] == 'Monday' else gr.iloc[-1])
df = pd.concat(df[~dup_mask], df_dup)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.