gpt4 book ai didi

pandas - 如何有选择地过滤pandas组中的元素

转载 作者:行者123 更新时间:2023-12-02 08:16:46 25 4
gpt4 key购买 nike

我想根据 pandas 组中的属性有选择地删除这些元素。

下面是一个示例:删除除“A”列中具有最高值的行之外的所有元素

>>> dff = pd.DataFrame({'A': np.arange(8), 'B': list('aabbbbcc'), 'C': list('lmnopqrt')})

>>> dff
A B C
0 0 a l
1 2 a m
2 4 b n
3 1 b o
4 9 b p
5 2 b q
6 3 c r
7 10 c t

>>> grped = dff.groupby('B')
>>> grped.groups
{'a': [0, 1], 'c': [6, 7], 'b': [2, 3, 4, 5]}

将自定义函数/方法应用于组(在“A”列上的组内排序,过滤元素)。

>>> yourGenius(grped,'A').reset_index()

返回数据帧:

   A  B  C
0 2 a m
1 9 b p
2 10 c t

也许有一种紧凑的方法可以使用 lambda 函数或 .filter() 来做到这一点?谢谢

最佳答案

如果您想每组选择一行,您可以使用groupby/agg 返回索引值并使用 loc 选择行。

例如,按 B 分组,然后选择具有最高 A 值的行:

In [171]: dff
Out[171]:
A B C
0 0 a l
1 2 a m
2 4 b n
3 1 b o
4 9 b p
5 2 b q
6 3 c r
7 10 c t

[8 rows x 3 columns]

In [172]: dff.loc[dff.groupby('B')['A'].idxmax()]
Out[172]:
A B C
1 2 a m
4 9 b p
7 10 c t

另一个选项( suggested by jezrael ),实际上是 faster for a wide range of DataFrames

dff.sort_values(by=['A'], ascending=False).drop_duplicates('B')

如果您希望每个组选择许多行,您可以使用 groupby/apply 以及返回子 DataFrame 的函数 每组。然后 apply 将尝试为您合并这些子 DataFrame。

例如,要选择每组中除最后一行之外的每一行:

In [216]: df = pd.DataFrame(np.arange(15).reshape(5,3), columns=list('ABC'), index=list('vwxyz')); df['A'] %= 2; df
Out[216]:
A B C
v 0 1 2
w 1 4 5
x 0 7 8
y 1 10 11
z 0 13 14


In [217]: df.groupby(['A']).apply(lambda grp: grp.iloc[:-1]).reset_index(drop=True, level=0)
Out[217]:
A B C
v 0 1 2
x 0 7 8
w 1 4 5

另一种方法是使用groupby/apply返回一系列索引值。 apply 再次尝试将系列合并为一个系列。然后,您可以使用 df.loc 按索引值选择行:

In [218]: df.loc[df.groupby(['A']).apply(lambda grp: pd.Series(grp.index[:-1]))]
Out[218]:
A B C
v 0 1 2
x 0 7 8
w 1 4 5
<小时/>

我不认为groupby/filter会做你想做的事,因为groupby/filter 过滤整个组。它不允许您从每个组中选择特定行。

关于pandas - 如何有选择地过滤pandas组中的元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23025256/

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