我试图访问DataFrame
在Pandas中整个应用的函数中的行的索引.我有这样的事情:
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
.
我知道我可以在表中创建一个临时列来存储索引,但是我想知道它是否在某个行对象中存在.
要在这种情况下访问索引,请访问该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
apply()
不是您要寻找的机器人。
DataFrame.iterrows()允许您遍历行并访问其名称:
for name, row in df.iterrows(): ...