Pandas DataFrame 的 apply() 方法提供了一行对象,但是如何访问索引值?

5
我是Panda和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(一次作为索引,一次作为列),这样可以工作,但这似乎很丑陋和有问题。 你有什么想法如何给定行对象来获取相应的索引值? 非常感谢。

那个“特定”的错误是因为你输入了 df.index(b) 而不是 df = df.set_index("b"),这就是为什么你得到了一个 NameError 而不是一个 KeyError。 (修复这个问题并不能解决你的问题,但它会让这个问题更有意义..) - DSM
感谢您的评论,我之前发布时犯了错误 - 是我的错。在喝第一杯茶之前发布了。我已经修复了帖子。 - Paul H
1个回答

5

我认为您想要的是这个:

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

这是有效的原因:
"{}.{}".format("ham", "cheese")

返回值

'ham.cheese'

如果引用单个行,名称属性将返回索引。对于上面的示例:
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函数将对所有行执行此操作。


希望这有所帮助。 - BKay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接