当前位置:  开发笔记 > 人工智能 > 正文

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

如何解决《获取pandas应用函数中的行索引》经验,为你挑选了2个好方法。

我试图访问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.

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



1> EdChum - Rei..:

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


对这里其他人的警告。我认为您从“ row.name”获得的索引是该行的数字索引。如果您有一个自定义索引(例如,每行都有一个字符串UUID),则不能在`apply`中访问它。更加令人困惑的是,对于第n行,df.iloc [n] .name将在apply之外返回第n行的UUID,但在apply approw.name内将返回n。 :http://stackoverflow.com/questions/18316211/access-index-in-pandas-series-apply
@Owen在链接的问题中,那是一个`Series`而不是一个df,对于一个你不能像这样访问索引值的系列,你可以为一个df.对于一个你需要转换为DataFrame的系列,请参阅Jeff的答案,你也可以对该系列做`to_frame()`

2> smci..:

apply() 不是您要寻找的机器人。

DataFrame.iterrows()允许您遍历行并访问其名称:

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


并且,如果有问题,“ itertuples”的性能通常要好得多:https://stackoverflow.com/questions/24870953/does-iterrows-have-performance-issues
推荐阅读
大大炮
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有