python - 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 的情况(我已经在上面的代码中注释掉了这种情况)
这是为什么?以及如何解决这个问题?
解决方案
如果我理解正确,您想要制作包含所有组和数字对的数据框。该操作称为笛卡尔积。如果这两个数组之间的长度差恰好为 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)
它现在应该可以工作了。
推荐阅读
- powershell - 在 Powershell 中返回一个可选列表
- ruby-on-rails - Rails minitest 返回“NoMethodError: undefined method `make_response!'”
- java - Java Instant.parse on Date java 8
- javascript - 回显 UTC 时间
- c - C:使用浮点的while循环永远不会终止
- arrays - postgresql中的数组差异
- javascript - 使用附近的 0.05 自定义舍入数字
- python - Python:应用程序的百分比/对其用户分析的任何记录
- apache-spark - 无法启动 Spark-shell
- javascript - Uppercase and lowercase search