小编典典

在熊猫应用函数中获取行的索引

all

我正在尝试访问应用于整个DataFramePandas 的函数中的行索引。我有这样的事情:

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

惊人的!现在,如果我想将索引合并到我的函数中怎么办?DataFrame添加之前任何给定行的索引d都是Index([u'a', u'b', u'c', u'd'], dtype='object'),但我想要 0 和 1。所以我不能只访问row.index.

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


阅读 60

收藏
2022-07-09

共1个答案

小编典典

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