【问题标题】:Pandas dataframe: how to permute rows and create new groups of combinationsPandas 数据框:如何排列行并创建新的组合组
【发布时间】:2021-07-19 15:30:40
【问题描述】:

我有以下带有 10 行和 4 列的 pandas 数据框 df,其中包含 3 个分类变量:

df = pd.DataFrame(np.random.choice(["dog", "cat", "mice"], size=(10, 4)))

我想知道行之间所有可能的排列,并创建一个新的数据框,其中包含行组合的不同分组,例如在同一行中包含两次相同变量的组,如 cat cat dog mice 或 4 个相同的 pig pig pig pig 等。我尝试过使用Itertools,但没有成功。有人可以帮助一些迹象吗?谢谢

【问题讨论】:

  • 如果你有预期的输出会更容易回答。
  • 输出将是一个包含多行和 2 列的表:第一列将包含可以包含相同行或对或唯一组合的不同组,第二列将包含看到的组的计数 (频率)

标签: python pandas pandas-groupby itertools


【解决方案1】:

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

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()
)

打印(例如):

items
((mice, 2), (dog, 2))              48
((cat, 1), (dog, 2), (mice, 1))    48
((cat, 3), (mice, 1))              24
((mice, 3), (cat, 1))              24
((dog, 1), (mice, 3))              48
((dog, 1), (cat, 2), (mice, 1))    24
((mice, 4))                        24
dtype: 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)

打印:

   dog  mice  cat  count
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 以便我可以绘制项目的一些组合吗?
  • 非常感谢!非常感谢您的帮助!!
  • 是否可以从初始df开始计算唯一组合的数量?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2017-05-06
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多