2014-10-07 108 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