我有这个数据框:
>>> 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
如何在熊猫中有效地做到这一点?
一种想法是先构建一个组合列(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/