使用pandas为每个组创建组合的DataFrame

时间:2018-03-14 06:22:51

标签: python pandas

输入如下。

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

3 个答案:

答案 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