我有以下df
id type
0 1 A
1 1 B
2 1 A
3 2 A
4 2 B
5 3 A
6 3 B
7 3 A
8 3 B
9 3 A
10 3 A
我們可以假設這些資料已經排序。我需要做的是,對于每個 id,我需要在以下條件下洗掉行
- 每個 id 的第一個條目是 type
A - 每個 id 的最后一個條目是 type
B - 最后一個條目
B是出現的最后一個(資料已經排序)
我已經完成了 1. 的以下操作:
df = df.groupby('id').filter(lambda x: x['Type'].iloc[0] != 'A')
如果他們的第一個型別不是,它會完全洗掉 idA
但是,對于 2. 和 3.,如果最后一個型別不是,我不想洗掉 id B,而是我只想洗掉中間的所有內容
結果df:
id type
0 1 A
1 1 B
3 2 A
4 2 B
5 3 A
8 3 B
示例代碼:
d = {'id': {0: 1, 1: 1, 2: 1, 3: 2, 4: 2, 5: 3, 6: 3, 7: 3, 8: 3, 9: 3, 10: 3},
'type': {0: 'A',
1: 'B',
2: 'A',
3: 'A',
4: 'B',
5: 'A',
6: 'B',
7: 'A',
8: 'B',
9: 'A',
10: 'A'}}
df = pd.DataFrame.from_dict(d)
uj5u.com熱心網友回復:
似乎您可以使用drop_duplicates不同的規則,具體取決于type:
out = pd.concat([df.query("type=='A'").drop_duplicates(subset=['id','type'], keep='first'),
df.query("type=='B'").drop_duplicates(subset=['id','type'], keep='last')]).sort_index()
輸出:
id type
0 1 A
1 1 B
3 2 B
4 2 A
5 3 A
8 3 B
uj5u.com熱心網友回復:
您可以簡單地使用掩碼對 DataFrame 進行切片:
m1 = df['type'].eq('B')
# first non-duplicate
m2 = ~df.duplicated(keep='first')
# last non-duplicate
m3 = ~df.duplicated(keep='last')
df[(m1&m2).shift(-1)|(m1&m3)]
# (m1&m2).shift(-1) -> value before the first B (i.e an A)
# (m1&m3) -> last B
輸出:
id type
0 1 A
1 1 B
3 2 A
4 2 B
5 3 A
8 3 B
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/461328.html
