2014-10-07 107 views
1

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

现在我有

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

,但它告诉我,“元组索引必须是整数,不能海峡”。如何在特定行中访问我想要的列?

+0

我会质疑为什么这样做?使用熊猫的重点在于尝试在整个系列或数据框上执行操作。如果你只想在符合条件的行上执行一些操作,那么'df.loc [df ['col']> 1.5,'col'] = doSomething'将获得相同的结果,并且会快速起泡因为它会被矢量化 – EdChum 2014-10-07 19:57:52

+0

没关系,太好了。如果它不大于1.5,我会在哪里放置一个备用的doSomething? – user3264659 2014-10-07 20:06:19

+0

你可以做一个'np.where'或者只是2个语句,所以'df ['col'] = np.where(df ['col']> 1.5,doSomething,doSomethingElse)'或者为另一个语句添加另一个语句条件'df.loc [df ['col'] <= 1.5,'col'] = doSomethingElse' – EdChum 2014-10-07 20:25:27

回答

1

iterrows yield(index,Series)对。因此,使用方法:

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

但是请注意,这a DataFrame is a primarily column-based data structure,所以 您将获得更好的性能,如果你可以构建围绕逐列 操作你的代码,而不是行操作。

+0

谢谢!这些对是不可变的,对吗?有没有一种方法可以重写列中的元素? – user3264659 2014-10-07 19:57:14

+1

EdChum的方法''df.loc [df ['col']> 1.5,'col'] = doSomething'会更好,假设'doSomething'是一个数字。如果不是,你将不得不更详细地解释“doSomething”是什么。 – unutbu 2014-10-07 20:00:02

1

也许最简单的解决方案是使用所述APPLYMAPAPPLY该函数适用于整个数据集的每个数据值类函数。

您可以有几种方法执行此:

df.applymap(someFunction) 

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

环节都低于:

ApplyMap Docs

Apply Docs