Python 如何从包含所有集合组合的项目集合创建数据框架?

Python 如何从包含所有集合组合的项目集合创建数据框架?,python,pandas,dataframe,Python,Pandas,Dataframe,我有一组字符串,需要从中构造DataFrame中的主指示符变量列。有没有办法在Python中进行这种维度扩展 例如,如果我有这两套: los = set(["abc", "def"]) his = set(["X", "Y", "Z"]) 我希望得到一个包含所有集合组合的数据帧。像这样: import pandas as pd df = pd.DataFrame({"los"

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

例如,如果我有这两套:

los = set(["abc", "def"])
his = set(["X", "Y", "Z"])
我希望得到一个包含所有集合组合的数据帧。像这样:

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

理想情况下,我希望这可以很容易地推广到任意数量的集合。

嵌套的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

一种更具python风格的方法是通过列表理解。有关更多详细信息,请参阅。

嵌套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

一种更具python风格的方法是通过列表理解。有关更多详细信息,请参阅。

您可以使用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

您可以使用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
您可以使用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
您可以使用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
退房。这样,您就不需要导入itertools:

pd.MultiIndex.from_product[los,his],name=['los','his'],to_frameindex=False 退房。这样,您就不需要导入itertools:

pd.MultiIndex.from_product[los,his],name=['los','his'],to_frameindex=False
您希望输出数据帧是什么样子?您希望“los”和“his”作为列标题吗?在您提供的情况下,由于los组合的数量超过his组合的数量,因此列的长度将不同。您想用NaN或空字符串填充多余的行吗?我不确定我是否理解您的观点?结果数据帧如我所述。您希望输出数据帧是什么样子?您希望“los”和“his”作为列标题吗?在您提供的情况下,由于los组合的数量超过his组合的数量,因此列的长度将不同。您想用NaN或空字符串填充多余的行吗?我不确定我是否理解您的观点?生成的数据帧如我所述。谢谢!这就是我要找的。我也喜欢@political_scientist的多索引方法,但是你的解决方案快了三倍。谢谢!这就是我要找的。我也喜欢@political_scientist的多索引方法,但你的解决方案快了三倍。