为什么我在使用pandas apply后数据框中出现空行?

5 投票
1 回答
3559 浏览
提问于 2025-04-18 00:11

我刚开始学习Python和Pandas,想弄明白怎么做一个简单的拆分-连接-应用操作。现在遇到的问题是,我从Pandas的apply函数得到的数据框里,最上面总是多出一行空白的,我不知道为什么。有人能解释一下吗?

下面是一个简单的例子,展示了这个问题,并不是我实际的代码:

sorbet = pd.DataFrame({
  'flavour': ['orange', 'orange', 'lemon', 'lemon'],
  'niceosity' : [4, 5, 7, 8]})

def calc_vals(df, target) :
    return pd.Series({'total' : df[target].count(), 'mean' : df[target].mean()})

sorbet_grouped = sorbet.groupby('flavour')
sorbet_vals = sorbet_grouped.apply(calc_vals, target='niceosity')

如果我接着执行 print(sorted_vals),我得到的输出是:

         mean  total
flavour                 <--- Why are there spaces here?
lemon     7.5      2
orange    4.5      2

[2 rows x 2 columns]

再对比一下 print(sorbet) 的结果:

  flavour  niceosity     <--- Note how column names line up
0  orange          4
1  orange          5
2   lemon          7
3   lemon          8

[4 rows x 2 columns]

是什么导致了这个差异,我该怎么解决呢?

1 个回答

12

groupby/apply操作会返回一个新的数据表(DataFrame),这个表有一个命名的索引。这个名字对应于原始数据表中用来分组的那一列的名字。

这个名字会显示在索引的上方。如果你把它重置为None,那么这个行就会消失:

In [155]: sorbet_vals.index.name = None

In [156]: sorbet_vals
Out[156]: 
        mean  total
lemon    7.5      2
orange   4.5      2

[2 rows x 2 columns]

要注意的是,这个name是很有用的——我不太建议去掉它。这个名字让你可以通过名字来引用这个索引,而不仅仅是通过数字。


如果你想把索引变成一列,可以使用reset_index

In [209]: sorbet_vals.reset_index(inplace=True); sorbet_vals
Out[209]: 
  flavour  mean  total
0   lemon   7.5      2
1  orange   4.5      2

[2 rows x 3 columns]

撰写回答