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

3 投票
1 回答
6863 浏览
提问于 2025-04-18 07:55

我有一个数据表,里面记录了几年来人们获得的奖金情况:

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

撰写回答