我有一个这样的数据框,
df
col1 col2 col3
1 A P
2 B P
3 C P
4 D P
5 E Q
6 F Q
7 G Q
8 H P
9 I P
10 J P
11 K P
我想在以下条件下从上方创建一个新的数据框, 如果col3值相同,则保留重复的col3值的第一行和最后一行。
所以最终的数据帧看起来像
df
col1 col2 col3
1 A P
4 D P
5 E Q
7 G Q
8 H P
11 K P
我可以使用for循环并迭代下一行来执行此操作,但是使用它执行时间会更多。寻找一些熊猫快捷方式/ pythonic方式最有效地完成此任务。
答案 0 :(得分:4)
让我们尝试shift
和cusmum
创建组,然后我们进行duplicated
s=df.col3.shift().ne(df.col3).cumsum()
sdf=df[~(s.duplicated() & s.iloc[::-1].duplicated())].copy()
sdf
Out[219]:
col1 col2 col3
0 1 A P
3 4 D P
4 5 E Q
6 7 G Q
7 8 H P
10 11 K P
答案 1 :(得分:0)
groupby的nth方法也可以正常工作,如@ Andy.L建议:
#get cumulative on col3
df['col4'] = df.col3.ne(df.col3.shift()).cumsum()
df.groupby('col4',sort=False).nth([0,-1])
col1 col2 col3
col4
1 1 A P
1 4 D P
2 5 E Q
2 7 G Q
3 8 H P
3 11 K P