从列表中创建pandas中的排列数据帧

时间:2017-10-14 07:38:12

标签: python pandas numpy

我之前曾问过类似的问题,但我正在寻找不同的输出。

Create a dataframe of permutations in pandas from list

我的清单如下:

aa = ['aa1', 'aa2', 'aa3', 'aa4', 'aa5']
bb = ['bb1', 'bb2', 'bb3', 'bb4', 'bb5']
cc = ['cc1', 'cc2', 'cc3', 'cc4', 'cc5']

现在我想创建一个数据帧,如下所示:

aa    bb    cc
aa1   bb1   cc1
aa2   bb1   cc1
aa3   bb1   cc1
aa4   bb1   cc1
aa5   bb1   cc1
aa1   bb2   cc1
aa1   bb3   cc1
aa1   bb4   cc1
aa1   bb5   cc1
aa1   bb1   cc2
aa1   bb1   cc3
aa1   bb1   cc4
aa1   bb1   cc5

我之前收到的建议是使用:

lists = [aa, bb, cc]
pd.DataFrame(list(itertools.product(*lists)), columns=['aa', 'bb', 'cc'])

这给了我一个笛卡尔积。

但这一次,它并不是我所寻找的。 我希望输出与上面的示例输出完全一样。 - 因此列表中的每个元素只在每列中出现一次,但第一个元素除外,它是重复的,用于填充整个列。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

首先构建重复部分:

index = pd.RangeIndex(len(aa) + len(bb) + len(cc))
df = pd.DataFrame({'aa':aa[0], 'bb':bb[0], 'cc':cc[0]}, index)

这给你15份副本:

aa1   bb1   cc1

然后覆盖不同的部分:

df.aa[:len(aa)] = aa
df.bb[len(aa):len(aa)+len(bb)] = bb
df.cc[len(aa)+len(bb):] = cc

提供所需的输出。