在pandas DataFrame中对每一行进行操作

12

我想遍历 pandas DataFrame 中的每一行,并对每行中的元素执行某些操作。

目前我的代码是:

for row in df.iterrows(): 
    if row['col'] > 1.5:
        doSomething

但它告诉我'Tuple indices must be integers, not str'。我如何在特定行中访问我想要的列?


1
我会质疑为什么要这样做?使用pandas的整个目的是尝试对整个系列或数据框执行操作。如果您只想在符合该标准的行上执行某些操作,则 df.loc[df ['col']> 1.5,'col'] = doSomething 将实现相同结果,并且速度非常快,因为它将进行向量化处理。 - EdChum
好的,如果它不大于1.5,我应该把另一个doSomething放在哪里? - user3264659
你可以使用 np.where 或者只用两个语句,例如 df['col'] = np.where(df['col'] > 1.5, doSomething, doSomethingElse),或者添加另一个语句来处理相反的情况 df.loc[df['col'] <=1.5, 'col'] = doSomethingElse - EdChum
这里的重点是避免循环,除非没有其他方法可以避免它。目前你的代码片段并没有明确你想要做什么,所以我们只能猜测,但很可能你不想循环遍历行,而应该尽可能使用向量化的方法。 - EdChum
3个回答

8
您可以使用带有选项axis=1apply函数。例如:
def my_function(row):
    if row['col'] > 1.5:
        doSomething()
    else:
        doSomethingElse()

my_df.apply(my_function, axis=1)

source


2
这是最佳答案,因为它是最有效的。使用for循环需要更多时间。使用向量函数而不是for循环计算所需的时间更少。观看Udacity的视频,了解如何使用pandas和NumPy的向量函数优化代码。 https://youtu.be/WF9n_19V08g - Ahwar

7

最简单的解决方案可能是使用APPLYMAPAPPLY函数,它们将该函数应用于数据集中的每个数据值。

您可以通过以下几种方式执行此操作:

df.applymap(someFunction)

或者

df[["YourColumns"]].apply(someFunction)

以下是链接:

ApplyMap 文档

Apply 文档


4

iterrows 产生(索引,Series)对。因此,请使用:

for index, row in df.iterrows(): 
    if row['col'] > 1.5:
        doSomething

请注意,DataFrame是一种主要基于列的数据结构,因此如果您可以围绕列操作而不是行操作来构建代码,则可以获得更好的性能。

这些对是不可变的,对吗?我能否以某种方式重写列中的元素? - user3264659
1
EdChum的方法,df.loc[df['col']>1.5, 'col'] = doSomething会更好,假设doSomething是一个数字。如果不是,你需要更详细地解释doSomething是什么。 - unutbu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接