Pandas Dataframe apply() 方法提供行对象,但如何访问索引值?

5 投票
1 回答
9906 浏览
提问于 2025-04-18 12:56

我刚接触Pandas和DataFrame,遇到了一些问题。DataFrame.apply()这个方法会把一行数据传给我写的函数。但是我找不到这行数据对应的索引值。

举个例子

df = DataFrame ({'a' : np.random.randn(6),
         'b' : ['foo', 'bar'] * 3,
         'c' : np.random.randn(6)})

df = df.set_index('a')

def my_test2(row):
   return "{}.{}".format(row['a'], row['b'])

df['Value'] = df.apply(my_test2, axis=1)

这会导致一个KeyError错误

KeyError: ('a', u'occurred at index -1.16119852166')

问题在于,在my_test2方法中,row['a']这一行出错了。如果我不使用df.set_index('a'),那就没问题,但我确实想把'a'作为索引。

我试着把'a'这一列复制了一份(一次作为索引,一次作为普通列),这样是可以的,但看起来很丑,而且可能会有问题。

有没有什么办法可以从这个行对象中获取对应的索引值呢?

非常感谢!

1 个回答

5

我觉得你想要的就是这个:

def my_test(row):
   return "{}.{}".format(row.name, row['b'])

这个方法之所以有效,是因为:

"{}.{}".format("ham", "cheese")

返回

'ham.cheese'

而如果你只引用一行,name属性会返回这个行的索引。对于上面的例子:

df.iloc[0].name

返回

b                           foo
c                      1.417726
Value    0.7842562355491481.foo
Name: 0.784256235549, dtype: object 

所以这个函数的作用就相当于找到第i行的索引,然后执行这个命令

"{}.{}".format(df.iloc[i].name, df.iloc[i]['b'])

接着apply函数会对所有行都执行这个操作。

撰写回答