我正在尝试使用两个列表创建一个熊猫数据框,并且在给定的列表长度下输出是错误的(这不是由于长度的变化而造成的)
在这里,我有两种情况,一种可以按预期工作,而另一种则不能(注释掉):
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的情况(我在上面的代码中已注释掉该情况)
那是为什么?以及如何解决?
答案 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'])
它现在应该可以工作。