计算数据框列中列表的所有排列

Posted

技术标签:

【中文标题】计算数据框列中列表的所有排列【英文标题】:compute all permutations of a list in a dataframe column 【发布时间】:2019-05-29 00:33:48 【问题描述】:

我正在尝试计算 df 中列表或列的所有排列,同时保留 id 列。

input df
    id    list
    1     foo bar
    2     dog cat

desired df output
    id    list
    1     foo bar
    1     bar foo
    2     dog cat
    2     cat dog

【问题讨论】:

真的'foo bar',还是['foo', 'bar'] 【参考方案1】:

IIUC 只使用来自itertoolspermutations,那么它是unnest

df['list']=df['list'].str.split(' ')
import itertools
df['list']=[list(itertools.permutations(x)) for x in df['list']]
pd.DataFrame('id':df.id.repeat(df['list'].str.len()),'list':np.concatenate(df['list'].values).tolist())
Out[522]: 
   id        list
0   1  [foo, bar]
0   1  [bar, foo]
1   2  [dog, cat]
1   2  [cat, dog]

【讨论】:

@leo 不,你不能:-)【参考方案2】:

您可以使用permutations 的列表推导:

from itertools import permutations

df = pd.DataFrame('id': [1, 2], 'list': [['foo', 'bar'], ['cat', 'dog']])

>>> pd.DataFrame([[id_, list(perm)] 
                  for id_, list_items in df.values for perm in permutations(list_items)], 
                 columns=['id', 'list'])
   id        list
0   1  [foo, bar]
1   1  [bar, foo]
2   2  [cat, dog]
3   2  [dog, cat]

根据列表内容的确切结构,您可能首先需要解析。

【讨论】:

此解决方案似乎解决了列中的多个字数统计问题,而第一个解决方案似乎仅适用于静态字数统计。 这不是更好地解决您的问题吗?此外,此解决方案不会改变原始数据帧。

以上是关于计算数据框列中列表的所有排列的主要内容,如果未能解决你的问题,请参考以下文章

计算数据框列中列表中单词的出现次数

计算数据框列中的剩余量

计算数据框列中真/假的出现次数

如何创建一个计算数据框列中 ID 频率的列?

Pyspark - 计算每个数据框列中的空值数量

如何仅计算数据框列中的“是”实体?