我有一个 df 如下:
df = pd.DataFrame({
'ID': ['James', 'James', 'James', 'James',
'Max', 'Max', 'Max', 'Max', 'Max',
'Park', 'Park','Park', 'Park',
'Tom', 'Tom', 'Tom', 'Tom'],
'From_num': [578, 420, 420, 'Started', 298, 78, 36, 298, 'Started', 28, 28, 311, 'Started', 60, 520, 99, 'Started'],
'To_num': [96, 578, 578, 420, 36, 298, 78, 36, 298, 112, 112, 28, 311, 150, 60, 520, 99],
'Date': ['2020-05-12', '2020-02-02', '2020-02-01', '2019-06-18',
'2019-08-26', '2019-06-20', '2019-01-30', '2018-10-23',
'2018-08-29', '2020-05-21', '2020-05-20', '2019-11-22',
'2019-04-12', '2019-10-16', '2019-08-26', '2018-12-11', '2018-10-09']})
并且我希望仅删除每个 ID 组中的连续行(忽略“日期”字段),例如第 1 行和第 2 行具有相同的值,并希望删除第二个重复行,与第 9 行和第 10 行相同,删除第10行,df是这样的:
ID From_num To_num Date
0 James 578 96 2020-05-12
1 James 420 578 2020-02-02
2 James 420 578 2020-02-01 # Drop the this duplicated row (ignore date)
3 James Started 420 2019-06-18
4 Max 298 36 2019-08-26
5 Max 78 298 2019-06-20
6 Max 36 78 2019-01-30
7 Max 298 36 2018-10-23
8 Max Started 298 2018-08-29
9 Park 28 112 2020-05-21
10 Park 28 112 2020-05-20 # Drop this duplicate row (ignore date)
11 Park 311 28 2019-11-22
12 Park Started 311 2019-04-12
13 Tom 60 150 2019-10-16
14 Tom 520 60 2019-08-26
15 Tom 99 520 2018-12-11
16 Tom Started 99 2018-10-09
我写了循环条件,但它非常冗余且缓慢,我认为可能有更简单的方法来做到这一点,所以如果您有想法,请帮助。万分感谢。预期的结果是这样的,请注意Max中还有两个不连续的值,第4行和第7行,我希望保留它们:
ID From_num To_num Date
0 James 578 96 2020-05-12
1 James 420 578 2020-02-02
2 James Started 420 2019-06-18
3 Max 298 36 2019-08-26
4 Max 78 298 2019-06-20
5 Max 36 78 2019-01-30
6 Max 298 36 2018-10-23
7 Max Started 298 2018-08-29
8 Park 28 112 2020-05-21
9 Park 311 28 2019-11-22
10 Park Started 311 2019-04-12
11 Tom 60 150 2019-10-16
12 Tom 520 60 2019-08-26
13 Tom 99 520 2018-12-11
14 Tom Started 99 2018-10-09
print( df[~(df.iloc[:,0:3] == df.iloc[:,0:3].shift()).all(axis=1)].reset_index(drop=True) )
打印:
ID From_num To_num Date
0 James 578 96 2020-05-12
1 James 420 578 2020-02-02
2 James Started 420 2019-06-18
3 Max 298 36 2019-08-26
4 Max 78 298 2019-06-20
5 Max 36 78 2019-01-30
6 Max 298 36 2018-10-23
7 Max Started 298 2018-08-29
8 Park 28 112 2020-05-21
9 Park 311 28 2019-11-22
10 Park Started 311 2019-04-12
11 Tom 60 150 2019-10-16
12 Tom 520 60 2019-08-26
13 Tom 99 520 2018-12-11
14 Tom Started 99 2018-10-09
与鸭数据库:
df1.sql().select("*,('{}-{}-{}').format(id,From_num,To_num) col1,lag(col1) over(order by index) lag2")\
.select("*,sum(case when col1!=lag2 then 1 end) over(order by index) col2")\
.select("*,row_number() over(partition by col2) col3").filter("col3=1")\
.select("ID,From_num,To_num,Date")
┌─────────┬──────────┬────────┬────────────┐
│ ID │ From_num │ To_num │ Date │
│ varchar │ varchar │ int64 │ varchar │
├─────────┼──────────┼────────┼────────────┤
│ Tom │ 60 │ 150 │ 2019-10-16 │
│ Park │ 28 │ 112 │ 2020-05-21 │
│ Tom │ 99 │ 520 │ 2018-12-11 │
│ James │ 578 │ 96 │ 2020-05-12 │
│ Max │ 36 │ 78 │ 2019-01-30 │
│ Park │ 311 │ 28 │ 2019-11-22 │
│ Tom │ Started │ 99 │ 2018-10-09 │
│ Max │ 298 │ 36 │ 2019-08-26 │
│ Max │ 298 │ 36 │ 2018-10-23 │
│ Park │ Started │ 311 │ 2019-04-12 │
│ Max │ Started │ 298 │ 2018-08-29 │
│ James │ 420 │ 578 │ 2020-02-02 │
│ James │ Started │ 420 │ 2019-06-18 │
│ Max │ 78 │ 298 │ 2019-06-20 │
│ Tom │ 520 │ 60 │ 2019-08-26 │
├─────────┴──────────┴────────┴────────────┤
│ 15 rows 4 columns │
└──────────────────────────────────────────┘