【问题标题】:How to create a pandas DataFrame from sets of items that includes all combinations of the sets?如何从包含所有集合组合的项目集创建熊猫数据框?
【发布时间】:2020-10-20 16:35:28
【问题描述】:

我有一组字符串,我需要从中构造 DataFrame 中的主要指标变量列。有没有办法在 Python pandas 中进行这种维度扩展?

例如如果我有这两组:

los = set(["abc", "def"])
his = set(["X", "Y", "Z"])

我希望得到一个包含所有集合组合的 DataFrame。像这样:

import pandas as pd
df = pd.DataFrame({"los": ["abc", "abc", "abc", "def", "def", "def"], "his": ["X", "Y", "Z", "X", "Y", "Z"]})

理想情况下,我希望它可以轻松推广到任意数量的集合。

【问题讨论】:

  • 您希望输出数据帧是什么样子的?是否要将“los”和“his”作为列标题?在您提供的情况下,由于 los 的组合数超过了 his 的组合数,因此列的长度会有所不同。您希望用 NaN 或空字符串填充多余的行吗?
  • 我不确定我是否理解您的意思?生成的 DataFrame 正如我所说的那样。

标签: python pandas dataframe


【解决方案1】:

你可以使用python内置的itertools.product很容易做到这一点:

import itertools
import pandas as pd

los = set(["abc", "def"])
his = set(["X", "Y", "Z"])

data = itertools.product(los, his)
df = pd.DataFrame(data, columns=["los", "his"])

print(df)
   los his
0  def   Z
1  def   X
2  def   Y
3  abc   Z
4  abc   X
5  abc   Y

【讨论】:

  • 谢谢!这就是我一直在寻找的。我也喜欢 @political_scientist 的 MultiIndex 方法,但您的解决方案快了三倍。
【解决方案2】:

您可以为此使用itertools.product

In [1308]: import itertools
In [1312]: x, y = [], []

In [1314]: for i,j in itertools.product(los,his):
      ...:     x.append(i)
      ...:     y.append(j)
      ...: 

In [1315]: x
Out[1315]: ['abc', 'abc', 'abc', 'def', 'def', 'def']

In [1316]: y
Out[1316]: ['Z', 'X', 'Y', 'Z', 'X', 'Y']

然后你可以像这样创建你的df:

In [1318]: df = pd.DataFrame({'los': x, 'his': y})

In [1319]: df
Out[1319]: 
   los his
0  abc   Z
1  abc   X
2  abc   Y
3  def   Z
4  def   X
5  def   Y

【讨论】:

    【解决方案3】:

    嵌套的 for 循环应该会生成您的数据

    los = set(["abc", "def"])
    his = set(["X", "Y", "Z"])
    
    a = []
    b = []
    for i in los:
        for j in his:
            a.append(i)
            b.append(j)
    

    结果

    a = ['def', 'def', 'def', 'abc', 'abc', 'abc']
    b = ['X', 'Y', 'Z', 'X', 'Y', 'Z']
    
    

    如果你想要字典格式:

    d = {}
    d['los'] = a
    d['his'] = b
    

    更 Pythonic 的方法是通过列表推导。详情请见this SO post

    【讨论】:

      【解决方案4】:

      查看pandas.MultiIndex.from_product。这样就不需要导入itertools:

      pd.MultiIndex.from_product([los, his], names=['los', 'his']).to_frame(index=False)
      

      【讨论】:

        猜你喜欢
        • 2021-06-02
        • 2019-11-29
        • 2021-12-01
        • 2017-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多