我有一个数据框,详细说明了几年来授予人们的钱:
Name -- Money -- Year
Paul 57.00 2012
Susan 67.00 2012
Gary 54.00 2011
Paul 77.00 2011
Andrea 20.00 2011
Albert 23.00 2011
Hal 26.00 2010
Paul 23.00 2010
根据这个数据框,我想构建一个数据框,详细说明一年内奖励的所有资金,用于制作箱线图:
2012 -- 2011 -- 2010
57.00 54.00 26.00
67.00 77.00 23.00
20.00
23.00
因此您会在不同长度的列中看到此结果。当我尝试使用 pandas 执行此操作时,出现错误 'ValueError: Length of values does not match length of index'。
我认为这是因为我无法向数据帧添加不同长度的列.
任何人都可以就如何进行提供一些建议吗?也许我正在错误地处理这个问题?感谢您的帮助!
最佳答案
我会分两步完成:首先使用 cumcount
添加对应于每年索引的列,然后 pivot
以便新的列是索引,年份成为列,货币列成为值:
df["yindex"] = df.groupby("Year").cumcount()
new_df = df.pivot(index="yindex", columns="Year", values="Money")
例如:
>>> df = pd.read_csv("money.txt", sep="\s+")
>>> df
Name Money Year
0 Paul 57 2012
1 Susan 67 2012
2 Gary 54 2011
3 Paul 77 2011
4 Andrea 20 2011
5 Albert 23 2011
6 Hal 26 2010
7 Paul 23 2010
>>> df["yindex"] = df.groupby("Year").cumcount()
>>> df
Name Money Year yindex
0 Paul 57 2012 0
1 Susan 67 2012 1
2 Gary 54 2011 0
3 Paul 77 2011 1
4 Andrea 20 2011 2
5 Albert 23 2011 3
6 Hal 26 2010 0
7 Paul 23 2010 1
>>> df.pivot(index="yindex", columns="Year", values="Money")
Year 2010 2011 2012
yindex
0 26 54 57
1 23 77 67
2 NaN 20 NaN
3 NaN 23 NaN
如果你愿意,之后你可以去掉 NaN,但这取决于你是否想区分“知道值为 0”和“不知道值是什么”的情况:
>>> df.pivot(index="yindex", columns="Year", values="Money").fillna(0)
Year 2010 2011 2012
yindex
0 26 54 57
1 23 77 67
2 0 20 0
3 0 23 0
关于python - 将不同长度的列添加到 Pandas 数据框中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23929070/