Python Pandas dataframe:如何排列行和创建新的组合组

Python Pandas dataframe:如何排列行和创建新的组合组,python,pandas,pandas-groupby,itertools,Python,Pandas,Pandas Groupby,Itertools,我有以下数据帧df,其中有10行4列,属性为3个分类变量: df=pd.DataFrame(np.random.choice([“狗”、“猫”、“老鼠”],大小=(10,4))) 我想知道行之间所有可能的排列,并创建一个包含不同行组合分组的新数据帧,例如,一个组在同一行中包含两倍于猫-猫-狗-老鼠或4倍于同一只猪的相同变量等。我尝试使用Itertools,但没有成功。有人帮你做一些指示吗?谢谢我希望我正确理解了你的问题。此示例将创建一个系列,其中索引是组合,值是此组合的大小: from col

我有以下数据帧df,其中有10行4列,属性为3个分类变量:

df=pd.DataFrame(np.random.choice([“狗”、“猫”、“老鼠”],大小=(10,4)))

我想知道行之间所有可能的排列,并创建一个包含不同行组合分组的新数据帧,例如,一个组在同一行中包含两倍于猫-猫-狗-老鼠或4倍于同一只猪的相同变量等。我尝试使用Itertools,但没有成功。有人帮你做一些指示吗?谢谢

我希望我正确理解了你的问题。此示例将创建一个系列,其中索引是组合,值是此组合的大小:

from collections import Counter
from itertools import permutations

print(
    df.assign(
        items=df.apply(
            lambda x: [
                frozenset(Counter(p).items()) for p in permutations(x, len(x))
            ],
            axis=1,
        )
    )
    .explode("items")
    .groupby("items")
    .size()
)
打印(例如):

项目
(老鼠2只狗2只)48
(猫,1)、(狗,2)、(老鼠,1))48
(猫,3只,(老鼠,1只))24
(小鼠,3只,(猫,1只))24
((狗,1),(老鼠,3))48
(狗,1)、(猫,2)、(老鼠,1))24
((小鼠,4))24
数据类型:int64

编辑:要获取数据帧,请执行以下操作:

x = (
    df.assign(
        items=df.apply(
            lambda x: [
                frozenset(Counter(p).items()) for p in permutations(x, len(x))
            ],
            axis=1,
        )
    )
    .explode("items")
    .groupby("items")
    .size()
)
df_out = (
    pd.DataFrame([dict(i, count=v) for i, v in zip(x.index, x)])
    .fillna(0)
    .astype(int)
)
print(df_out)
印刷品:

狗鼠猫数
0    1     1    2     24
1    2     2    0     72
2    2     1    1     24
3    0     2    2     48
4    4     0    0     24
5    0     3    1     24
6    1     3    0     24

如果您有一个预期的输出,回答起来会更容易。输出将是一个包含多行和两列的表:第一列将包含不同的组,这些组可以包含相同的行、对或唯一的组合,第二列将包含看到的组的计数(频率)太好了,我想是这样!谢谢你,安德烈!!你知道我如何从输出中创建一个新的df,以便绘制一些项目组合吗?@JessBR请查看我的编辑。非常感谢!非常感谢你的帮助!!是否可以从初始df计算唯一组合的数量?