gpt4 book ai didi

python - 根据列中的值获取第一行和最后一行数据框组

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:16 25 4
gpt4 key购买 nike

我有一个看起来像这样的数据框

df = pd.DataFrame({'c1': ['a','a','a', 'b','b','a','a'],
'c2':[1,3,5,7,9,11,13],
'c3':[2,4,6,8,10,12,14]})



c1 c2 c3
0 a 1 2
1 a 3 4
2 a 5 6
3 b 7 8
4 b 9 10
5 a 11 12
6 a 13 14

每次 c1 列中的值发生变化时,我都想获取第一行和最后一行。

在示例中,输出将是

  c1  c2  c3
0 a 1 2
2 a 5 6
3 b 7 8
4 b 9 10
5 a 11 12
6 a 13 14

我可以用

idx = np.where(df.c1.ne(df.c1.shift()) != 0)[0]

像这样获取第一行

df.iloc[idx,:]

c1 c2 c3
0 a 1 2
3 b 7 8
5 a 11 12

但我无法获取最后一行

  c1  c2  c3
2 a 5 6
4 b 9 10
6 a 13 14

获取这些行的最佳方式是什么?

最佳答案

您可以通过 bool 掩码过滤来简化您的解决方案:

df1 = df[df.c1.ne(df.c1.shift())]
print (df1)
c1 c2 c3
0 a 1 2
3 b 7 8
5 a 11 12

df2 = df[df.c1.ne(df.c1.shift(-1))]
print (df2)
c1 c2 c3
2 a 5 6
4 b 9 10
6 a 13 14

对于 | 的所有行链条件,按位或:

df3 = df[df.c1.ne(df.c1.shift()) | df.c1.ne(df.c1.shift(-1))]
print (df3)
c1 c2 c3
0 a 1 2
2 a 5 6
3 b 7 8
4 b 9 10
5 a 11 12
6 a 13 14

性能:

显然不是 groupby 解决方案更快,但最好在真实数据中测试:

#7k rows
df = pd.concat([df] * 1000, ignore_index=True)

In [53]: %timeit df.groupby(df.c1.ne(df.c1.shift()).cumsum(), as_index=False).nth([0, -1])
3.57 ms ± 283 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [54]: %timeit df[df.c1.ne(df.c1.shift()) | df.c1.ne(df.c1.shift(-1))]
1.53 ms ± 6.79 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

关于python - 根据列中的值获取第一行和最后一行数据框组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54625052/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com