簡體   English   中英

Pandas - 刪除重復項但根據列中的值更改 keep:first/last

[英]Pandas - Drop duplicates but change keep:first/last according to a value in a column

我試圖為星期一的每個唯一日期保留第一行,但為星期五的每個唯一日期保留最后一行。

我嘗試添加一個指標列,其中星期一 = 1 和星期五 = 2。

我似乎無法弄清楚解決這個問題的最佳方法是什么? 我嘗試使用drop_duplicates但我只知道如何使用它來選擇將檢查重復項的列,但我無法弄清楚如何根據每一行中“Day”的值在firstlast之間切換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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM