试着看看这与熊猫有多么难或多么容易。
让我们说一个人有两列数据,如:
Cat1 Cat2
A 1
A 2
A 3
B 1
B 2
C 1
C 2
C 3
D 4
如您所见A
和C
有三个共同元素1, 2, 3
。 B
只有两个元素1和2. D
只有一个元素:4。
如何以编程方式获得相同的结果。这个想法是让每个小组以某种方式返回。因此,[A, C]
和[1, 2, 3]
,[B]
和[1, 2]
以及[D]
[4]
。
我知道可以写一个程序来做这个,所以我想弄清楚Pandas上是否有东西可以做到,而不必从头开始构建东西。
谢谢!
答案 0 :(得分:3)
您可以使用groupby
两次来实现此目的。
df = df.groupby('Cat1')['Cat2'].apply(lambda x: tuple(set(x))).reset_index()
df = df.groupby('Cat2')['Cat1'].apply(lambda x: tuple(set(x))).reset_index()
我正在使用tuple
,因为pandas需要使用元素才能进行groupby
。上面的代码不区分(1, 2, 3)
和(1, 1, 2, 3)
。如果您想进行此区分,请将set
替换为sorted
。
结果输出:
Cat2 Cat1
0 (1, 2) (B,)
1 (1, 2, 3) (A, C)
2 (4,) (D,)
答案 1 :(得分:0)
你也可以:
df = df.set_index('Cat1', append=True).unstack().loc[:, 'Cat2']
df = pd.Series({col: tuple(values.dropna()) for col, values in df.items()})
df = df.groupby(df.values).apply(lambda x: list(x.index))
获取
Cat1
(1.0, 2.0) [B]
(1.0, 2.0, 3.0) [A, C]
(4.0,) [D]