我想用多个不同长度的列表创建pandas数据框架。下面是我的python代码。
import pandas as pd
A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6]
lenA = len(A)
lenB = len(B)
lenC = len(C)
df = pd.DataFrame(columns=['A', 'B','C'])
for i,v1 in enumerate(A):
for j,v2 in enumerate(B):
for k, v3 in enumerate(C):
if(i<random.randint(0, lenA)):
if(j<random.randint(0, lenB)):
if (k < random.randint(0, lenC)):
df = df.append({'A': v1, 'B': v2,'C':v3}, ignore_index=True)
print(df)
我的列表如下。
A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6,7]
在每次运行中,我得到了不同的输出,哪些是正确的。但并不是每次运行都能覆盖所有的列表项。在一次运行中,我得到了如下的输出。
A B C
0 1 1 3
1 1 2 1
2 1 2 2
3 2 2 5
在上面的输出中,’A’列表的所有项目(1,2)都在那里。但’B’列表只有(1,2)项,缺少第3项。另外,’C’列表只有(1,2,3,5)项。(4,6,7)项在’C’列表中缺失。我的期望是:在每个列表中,每个项目至少应该在数据框中出现一次,而’C’列表中的项目应该只在数据框中出现一次。我期望的示例输出如下。
A B C
0 1 1 3
1 1 2 1
2 1 2 2
3 2 2 5
4 2 3 4
5 1 1 7
6 2 3 6
请指导我得到我期望的输出。先谢谢你。
解决方案:
你可以将每个列表的随机值加到总长度上,然后使用 DataFrame.sample
:
A=[1,2]
B=[1,2,3]
C=[1,2,3,4,5,6]
L = [A,B,C]
m = max(len(x) for x in L)
print (m)
6
a = [np.hstack((np.random.choice(x, m - len(x)), x)) for x in L]
df = pd.DataFrame(a, index=['A', 'B', 'C']).T.sample(frac=1)
print (df)
A B C
2 2 2 3
0 2 1 1
3 1 1 4
4 1 2 5
5 2 3 6
1 2 2 2