Python 如何从包含所有集合组合的项目集合创建数据框架?
我有一组字符串,需要从中构造DataFrame中的主指示符变量列。有没有办法在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"
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的多索引方法,但你的解决方案快了三倍。