熊猫使用两个行为不同的列表创建DataFrame

时间:2019-05-06 08:31:40

标签: python pandas

我正在尝试使用两个列表创建一个熊猫数据框,并且在给定的列表长度下输出是错误的(这不是由于长度的变化而造成的)

在这里,我有两种情况,一种可以按预期工作,而另一种则不能(注释掉):

import string
d = dict.fromkeys(string.ascii_lowercase, 0).keys()
groups = sorted(d)[:3]
numList = range(0,4)
# groups = sorted(d)[:20]
# numList = range(0,25)

df = DataFrame({'Number':sorted(numList)*len(groups), 'Group':sorted(groups)*len(numList)})

df.sort_values(['Group', 'Number'])

预期输出:组中的每个项目,对应于numList中的所有项目

  Group Number 
    a   0
    a   1
    a   2
    a   3
    b   0
    b   1
    b   2
    b   3
    c   0
    c   1
    c   2
    c   3

实际结果:适用于列表大小分别为3和4而不是20和25的情况(我在上面的代码中已注释掉该情况)

那是为什么?以及如何解决?

1 个答案:

答案 0 :(得分:1)

如果我正确理解这一点,那么您想制作一个包含所有成对的组和数字的数据框。该操作称为笛卡尔乘积。 如果这两个数组之间的长度差正好为1,则可以使用您的方法,但这纯属偶然。对于一般情况,您想这样做。

ren *.png ???-1.*

只需注意数据帧排序:您需要记住,在熊猫中,大多数DataFrame操作默认情况下都会返回新的DataFrame,除非您传递了df1 = DataFrame({'Number': sorted(numList)}) df2 = DataFrame({'Group': sorted(groups)}) df = df1.assign(key=1).merge(df2.assign(key=1), on='key').drop('key', 1) 参数,否则不要修改旧的DataFrame。 所以你应该做

inplace=True

df = df.sort_values(['Group', 'Number'])

它现在应该可以工作。