将不同长度的列添加到pandas数据帧中

时间:2014-05-29 08:35:11

标签: python pandas dataframe

我有一个数据框,详细说明了几年来给予人们的资金:

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我接近这个错误?谢谢你的帮助!

1 个答案:

答案 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