python - 如何根据 groupby 的结果在 Pandas 数据框中生成所有值对

标签 python python-2.7 pandas combinations

我有一个 Pandas 数据框df:

ID     words
1      word1
1      word2
1      word3
2      word4
2      word5
3      word6
3      word7
3      word8
3      word9

我想生成另一个数据框来生成每组中的所有单词对。所以上面的结果是:

ID     wordA    wordB
1      word1    word2
1      word1    word3
1      word2    word3
2      word4    word5
3      word6    word7
3      word6    word8
3      word6    word9
3      word7    word8
3      word7    word9
3      word8    word9

我知道我可以使用 df.groupby['words'] 获取每个 ID 中的单词。

我也知道我可以用

iterable = ['word1','word2','word3']
list(itertools.combinations(iterable, 2))

获取所有可能的成对组合。但是,对于生成如上所示的结果数据框的最佳方法,我有点迷茫。

最佳答案

它在应用和堆栈中简单使用 itertools 组合,即

from itertools import combinations
ndf = df.groupby('ID')['words'].apply(lambda x : list(combinations(x.values,2)))
                          .apply(pd.Series).stack().reset_index(level=0,name='words')

 ID           words
0   1  (word1, word2)
1   1  (word1, word3)
2   1  (word2, word3)
0   2  (word4, word5)
0   3  (word6, word7)
1   3  (word6, word8)
2   3  (word6, word9)
3   3  (word7, word8)
4   3  (word7, word9)
5   3  (word8, word9)

为了进一步匹配您的精确输出,我们必须做

sdf = pd.concat([ndf['ID'],ndf['words'].apply(pd.Series)],1).set_axis(['ID','WordsA','WordsB'],1,inplace=False)

   ID WordsA WordsB
0   1  word1  word2
1   1  word1  word3
2   1  word2  word3
0   2  word4  word5
0   3  word6  word7
1   3  word6  word8
2   3  word6  word9
3   3  word7  word8
4   3  word7  word9
5   3  word8  word9

要将它转换为一行,我们可以这样做:

combo = df.groupby('ID')['words'].apply(combinations,2)\
                     .apply(list).apply(pd.Series)\
                     .stack().apply(pd.Series)\
                     .set_axis(['WordsA','WordsB'],1,inplace=False)\
                     .reset_index(level=0)

关于python - 如何根据 groupby 的结果在 Pandas 数据框中生成所有值对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47618888/

相关文章:

python - 将相对 url 路径解析为其绝对路径

python - 操作系统错误 : cannot load library 'C:\Program Files\R\R-4.0.2\bin\x64\R.dll' : error 0x7e

python - 在Python中传递锁

python - 如何根据多个值对 pandas 数据框进行排序

python - 如何根据列值而不是索引来 pd.concat 数据帧?

python - 创建新列时日期转换不起作用

python - Python 中的无限递归

python - Tensorflow:如何平铺按特定顺序重复的张量?

python - 计算列表从0到n-1的元素之和并与最大的比较

regex - 将字符串格式化为XML文件