我正在尝试访问应用于整个DataFramePandas 的函数中的行索引。我有这样的事情:
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
惊人的!现在,如果我想将索引合并到我的函数中怎么办?DataFrame添加之前任何给定行的索引d都是Index([u'a', u'b', u'c', u'd'], dtype='object'),但我想要 0 和 1。所以我不能只访问row.index.
d
Index([u'a', u'b', u'c', u'd'], dtype='object')
row.index
我知道我可以在存储索引的表中创建一个临时列,但我想知道它是否存储在某处的行对象中。
在这种情况下,要访问索引,您需要访问name属性:
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 索引:
rowFunc
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