输入如下。
Out[178]:
group value
0 A a
1 A b
2 A c
3 A d
4 B c
5 C d
6 C e
7 C a
对于此输入,我想为每个组创建一个组合并创建一个DataFrame。我该怎么办?
我想得到的输出:
Out[180]:
group 0 1
0 A a b
1 A a c
2 A a d
3 A b c
4 A b d
5 A c d
0 C d e
1 C d a
2 C e a
答案 0 :(得分:8)
在理解中使用combinations
from itertools import combinations
pd.DataFrame([
[n, x, y]
for n, g in df.groupby('group').value
for x, y in combinations(g, 2)
], columns=['group', 0, 1])
group 0 1
0 A a b
1 A a c
2 A a d
3 A b c
4 A b d
5 A c d
6 C d e
7 C d a
8 C e a
答案 1 :(得分:5)
将groupby
与lambda函数和combinations
一起使用:
from itertools import combinations
df = (df.groupby('group')['value'].apply(lambda x: pd.DataFrame(list(combinations(x,2))))
.reset_index(level=1, drop=True)
.reset_index())
print (df)
group 0 1
0 A a b
1 A a c
2 A a d
3 A b c
4 A b d
5 A c d
6 C d e
7 C d a
8 C e a
答案 2 :(得分:1)
这可以通过itertools
和列表理解来实现:
from itertools import combinations, chain
gen = ([(g,)+i for i in list(combinations(df.loc[df['group'] == g, 'value'], 2))] \
for g in df['group'].unique())
df_out = pd.DataFrame(list(chain.from_iterable(gen)), columns=['group', 0, 1])
<强>结果强>
group 0 1
0 A a b
1 A a c
2 A a d
3 A b c
4 A b d
5 A c d
6 C d e
7 C d a
8 C e a