gpt4 book ai didi

python - 如何标记 Pandas 中的成对组?

转载 作者:行者123 更新时间:2023-11-30 22:32:40 25 4
gpt4 key购买 nike

我有这个数据框:

>>> df = pd.DataFrame({'A': [1, 2, 1, np.nan, 2, 2, 2], 'B': [2, 1, 2, 2.0, 1, 1, 2]})
>>> df
A B
0 1.0 2.0
1 2.0 1.0
2 1.0 2.0
3 NaN 2.0
4 2.0 1.0
5 2.0 1.0
6 2.0 2.0

我需要在第三列“group id”上识别对(A,B)的组,以获得如下内容:

>>> df
A B grup id explanation
0 1.0 2.0 1.0 <- group (1.0, 2.0), first group
1 2.0 1.0 2.0 <- group (2.0, 1.0), second group
2 1.0 2.0 1.0 <- group (1.0, 2.0), first group
3 NaN 2.0 NaN <- invalid group
4 2.0 1.0 2.0 <- group (2.0, 1.0), second group
5 2.0 1.0 2.0 <- group (2.0, 1.0), second group
6 2.0 2.0 3.0 <- group (2.0, 2.0), third group

如何在 pandas 中有效地做到这一点?

一个想法是首先构建一个组合列(A,B),然后识别该列中的唯一值并将它们映射回我的数据帧。但我怀疑 groupby() 方法会更快(而且更优雅)。

我尝试过这个:

>>> df.groupby(['A','B']).count()
Empty DataFrame
Columns: []
Index: [(1.0, 2.0), (2.0, 1.0), (2.0, 2.0)]

所以这个groupby()的索引列出了我需要的所有组。但是如何计算它们并将它们映射回我的数据框?

最佳答案

您可以使用GroupBy.ngroup ( Pandas 0.20.2+):

print (df.groupby(['A','B']).ngroup())
0 0
1 1
2 0
3 -1
4 1
5 1
6 2
dtype: int64

df['grup id'] = df.groupby(['A','B']).ngroup().replace(-1,np.nan).add(1)
print (df)
A B grup id
0 1.0 2.0 1.0
1 2.0 1.0 2.0
2 1.0 2.0 1.0
3 NaN 2.0 NaN
4 2.0 1.0 2.0
5 2.0 1.0 2.0
6 2.0 2.0 3.0

类似替换-1并添加1:

df['grup id'] = df.groupby(['A','B']).ngroup()
df['grup id'] = np.where(df['grup id'] == -1, np.nan, df['grup id'] + 1)
print (df)
A B grup id
0 1.0 2.0 1.0
1 2.0 1.0 2.0
2 1.0 2.0 1.0
3 NaN 2.0 NaN
4 2.0 1.0 2.0
5 2.0 1.0 2.0
6 2.0 2.0 3.0

对于 pandas 的最旧版本(低于 0.20.2):

df['grup id'] = df.groupby(["A","B"]).grouper.group_info[0]
df['grup id'] = np.where(df['grup id'] == -1, np.nan, df['grup id'] + 1)
print (df)
A B grup id
0 1.0 2.0 1.0
1 2.0 1.0 2.0
2 1.0 2.0 1.0
3 NaN 2.0 NaN
4 2.0 1.0 2.0
5 2.0 1.0 2.0
6 2.0 2.0 3.0

关于python - 如何标记 Pandas 中的成对组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397047/

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