我有一个数据框,详细说明了几年来给予人们的资金:
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'.
我认为这是因为我无法将不同长度的列添加到数据帧。
有人可以就如何进行提供一些建议吗? Perhap我接近这个错误?谢谢你的帮助!
答案 0 :(得分:2)
我将在两个步骤中执行此操作:首先使用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
如果你愿意,你可以摆脱NaNs,但这取决于你是否要区分“知道价值为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