Python中使用Pandas的.apply()时如何获取当前行索引?
解决Pandas.apply()中获取当前行数据及索引的问题
你的问题核心在于当你只对单个列调用.apply()时,函数只能拿到该列的单个元素,无法直接获取当前行的索引或其他列的数据。你不需要单独去获取行索引,更高效的方式是让.apply()处理整个行,这样就能同时访问col1和col2的数据。
下面是修改后的完整解决方案:
方法1:处理整行数据(推荐)
将.apply()的axis参数设置为1,这样函数会接收每一行的Series对象,你可以直接从中获取col1和col2的数据,完全不需要依赖行索引:
import pandas as pd str1 = 'The weight of a apple' str2 = 'Apple MacBook release date news and rumors' list1 = ['DET', 'NOUN', 'ADP', 'DET', 'NOUN'] list2 = ['PROPN', 'NOUN', 'NOUN', 'NOUN', 'CCONJ', 'PROPN'] df = pd.DataFrame( { 'col1': [str1, str2], 'col2': [list1, list2] } ) # 修改后的自定义函数,接收整行数据 def find_apple(row): keyword = 'apple' text = row['col1'] pos_list = row['col2'] words = text.lower().split(' ') if keyword in words: word_index = words.index(keyword) # 直接从当前行的col2列表中取值 return pos_list[word_index] else: return 'None' # 调用apply时设置axis=1,处理每一行 df['col3'] = df.apply(find_apple, axis=1) print(df)
运行后输出:
col1 col2 col3 0 The weight of a apple [DET, NOUN, ADP, DET, NOUN] NOUN 1 Apple MacBook release date news and rumors [PROPN, NOUN, NOUN, NOUN, CCONJ, PROPN] None
方法2:获取行索引(如果确实需要)
如果你一定要获取当前行的索引,可以通过row.name拿到,但前提同样是用axis=1让函数接收整行:
def find_apple_with_index(row): keyword = 'apple' curr_row_index = row.name # 获取当前行索引 text = row['col1'] words = text.lower().split(' ') if keyword in words: word_index = words.index(keyword) value = df.loc[curr_row_index, 'col2'][word_index] return value else: return 'None' df['col3'] = df.apply(find_apple_with_index, axis=1)
不过这种方法不推荐,因为它依赖全局的df对象,不如直接从row中取col2数据更直观和高效。
你原来代码的问题分析
- 你调用
df['col1'].apply(find_apple)时,函数find_apple只接收到col1的单个字符串,没有行的上下文,所以无法获取索引或其他列。 - 你尝试的
df.index是整个DataFrame的索引对象,不是当前行的索引;而row.name在你原来的函数里根本不存在,因为函数参数是单个text,不是row。
内容的提问来源于stack exchange,提问作者Md Saif
相关产品推荐
相关产品推荐

