在pandas应用函数中获取一行的索引

我试图访问在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
< p >太棒了!现在如果我想把下标合并到函数中呢? 在添加d之前,DataFrame中任何给定行的索引都是Index([u'a', u'b', u'c', u'd'], dtype='object'),但我想要0和1。所以我不能只访问row.index.

我知道我可以在存储索引的表中创建一个临时列,但我想知道它是否存储在row对象的某个地方。

170575 次浏览

在这种情况下,要访问索引,需要访问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

编辑

3年多以后再看这个问题,你可以这样做:

In[15]:
df['d'],df['rowIndex'] = df['a'] + df['b'] * df['c'], df.index
df


Out[15]:
a  b  c   d  rowIndex
0  1  2  3   7         0
1  4  5  6  34         1

但假设它不是这么简单,无论你的rowFunc真正在做什么,你都应该使用向量化函数,然后对df索引使用它们:

In[16]:
df['newCol'] = df['a'] + df['b'] + df['c'] + df.index
df


Out[16]:
a  b  c   d  rowIndex  newCol
0  1  2  3   7         0       6
1  4  5  6  34         1      16
< p >: # 1。row.nameapply(..., axis=1)调用中:

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


a  b  c
x  1  2  3
y  4  5  6


df.apply(lambda row: row.name, axis=1)


x    x
y    y

# 2。iterrows()(更慢)

DataFrame.iterrows ()允许你遍历行,并访问它们的索引:

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

要回答最初的问题:是的,您可以访问apply()中一行的下标值。它在键name下可用,并且需要指定axis=1(因为lambda处理的是一行的列,而不是列的行)。

工作示例(pandas 0.23.4):

>>> import pandas as pd
>>> df = pd.DataFrame([[1,2,3],[4,5,6]], columns=['a','b','c'])
>>> df.set_index('a', inplace=True)
>>> df
b  c
a
1  2  3
4  5  6
>>> df['index_x10'] = df.apply(lambda row: 10*row.name, axis=1)
>>> df
b  c  index_x10
a
1  2  3         10
4  5  6         40