将不同长度的列添加到pandas数据框中
我有一个数据表,里面记录了几年来人们获得的奖金情况:
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'.
我猜这可能是因为我不能把长度不一样的列添加到数据表里。
有没有人能给我一些建议,告诉我该怎么做?也许我这个方法不太对?谢谢大家的帮助!
1 个回答
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
之后,如果你愿意,可以去掉那些 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