2014-10-30 37 views
37

我正试图访问应用于Pandas中整个DataFrame的函数中的一行索引。我有这样的事情:获取熊猫应用函数中一行的索引

df = pandas.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
>>> df 
    a b c 
0 1 2 3 
1 4 5 6 

,我会定义一个给定的行

def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

访问元素的功能,我可以应用它,像这样:

df['d'] = df.apply(rowFunc, axis=1) 
>>> df 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

真棒!现在如果我想将索引合并到我的函数中呢? 在添加d之前,此DataFrame中的任何给定行的索引将为Index([u'a', u'b', u'c', u'd'], dtype='object'),但我想要0和1.因此,我不能只访问row.index

我知道我可以创建在我存储索引的表的临时列,但我“米不知道如果在该行对象sotred地方。

+1

旁白:有没有你需要使用'apply'理由吗?它比在框架上执行矢量化操作要慢得多。 (有时候*是最简单的方法来做某事,性能方面的考虑往往被夸大了,但是对于你特定的例子来说,它很容易*而不是使用它。) – DSM 2014-10-30 16:26:25

+1

@DSM实际上我为每一行调用另一个对象构造函数使用不同的行元素。我只是想举一个最小的例子来说明这个问题。 – Mike 2014-10-30 17:27:53

+0

'apply()'不是你正在寻找的机器人;改用'df.iterrows()'。看到我的答案。这是一个XY问题 – smci 2018-02-16 04:04:36

回答

45

要访问该指数在这种情况下,您访问name属性:

In [182]: 

df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c']) 
def rowFunc(row): 
    return row['a'] + row['b'] * row['c'] 

def rowIndex(row): 
    return row.name 
df['d'] = df.apply(rowFunc, axis=1) 
df['rowIndex'] = df.apply(rowIndex, axis=1) 
df 
Out[182]: 
    a b c d rowIndex 
0 1 2 3 7   0 
1 4 5 6 34   1 

注意,如果这真的是你想怎么办,下面的工作是要快得多:

In [198]: 

df['d'] = df['a'] + df['b'] * df['c'] 
df 
Out[198]: 
    a b c d 
0 1 2 3 7 
1 4 5 6 34 

In [199]: 

%timeit df['a'] + df['b'] * df['c'] 
%timeit df.apply(rowIndex, axis=1) 
10000 loops, best of 3: 163 µs per loop 
1000 loops, best of 3: 286 µs per loop 
+0

这里的任何人的警告。我认为你从'row.name'得到的索引是该行的数字索引。如果你有一个自定义索引(对每一行说一个字符串UUID),你不能在'apply'中访问它。更令人困惑的是,对于行'n','df.iloc [n] .name'将在'apply'之外返回行n的UUID,但'apply''row.name'内将返回'n' ...参见:http://stackoverflow.com/questions/18316211/access-index-in-pandas-series-apply – Owen 2017-01-27 11:18:11

+2

@Owen在链接的问题,这是一个'系列'不是DF,对于你无法访问的系列像这样的索引值,你可以为一个df。对于需要转换为DataFrame的系列,请参阅Jeff的答案,还可以在该系列上执行'to_frame()' – EdChum 2017-01-27 11:21:53

0

apply()不是你正在寻找的机器人。

DataFrame.iterrows()允许您遍历行和访问他们的名字:

for name, row in df.iterrows(): 
    ...