首页 > 解决方案 > Pandas 使用两个行为不同的列表创建 DataFrame

问题描述

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

这里我有两种情况,一种按预期工作,另一种没有(注释掉):

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 的情况(我已经在上面的代码中注释掉了这种情况)

这是为什么?以及如何解决这个问题?

标签: pythonpandas

解决方案


如果我理解正确,您想要制作包含所有组和数字对的数据框。该操作称为笛卡尔积。如果这两个数组之间的长度差恰好为 1,则它适用于您的方法,但这更多是出于偶然。对于一般情况,您想要这样做。

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)

并且只是注意数据帧排序:您需要记住,在熊猫中,大多数数据帧操作默认返回新的数据帧,不要修改旧的数据帧,除非您传递inplace=True参数。所以你应该做

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

或者

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

它现在应该可以工作了。


推荐阅读