簡體   English   中英

了解熊貓中的行迭代(Python)

[英]Understanding row iteration in pandas (python)

我有一個(在此示例中)有2行的數據框,該數據框看起來像這樣:

PERON   START   END
AB     100      120
CC     110      115

(我想要的,但不是我要問的問題是, 如果“ START”-'END'等於20,則為每行創建一個帶有標志的新列)(在其他用例中,我也遇到類似的問題)

(我試過了

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0

我也嘗試過:

 for i in df.iterrows():
    print i[0]
    if abs(df.START-df.END)==20:
        print 'Legit to make be a flag'

問題:每次收到消息“系列的真值不明確。請使用a.empty,a.bool(),a.item(),a.any()或a.all()”。

我了解,如果您不遍歷每一行,python都不知道將哪個值與“ if-statement”進行比較,因此,如果您希望在至少一行滿足條件的情況下給出一個標志,則使用a.any() if語句的條件。 a.all()如果所有行都應匹配行條件...

現在,我的問題是 :為什么python為什么不檢查基於行的if語句(肯定在for循環中),並保持它的狀態為“系列的真值不明確?請使用a.empty,a.bool (),a.item(),a.any()或a.all()。”-錯誤

問題的其他提法:為什么python在df.iterrows()中的for for python中仍然在整個數據幀級別執行if語句,而不是逐行執行。

因為在下面的代碼中打印出for循環位於行“ 0”中,所以我假設python將對行“ 0”執行if語句。 但是它不檢查該行的if語句,因為它給我“歧義閾值錯誤” ...

for i in df.iterrows():
    print i[0]

我已經看過“使用真假陳述與熊貓”文檔和其他一些stackoverflow問題,但是我無法弄清楚哪里出了問題(很可能是因為我仍然在python-noob-相)。

這取決於熊貓如何在可能的地方對操作進行矢量化處理。

abs(df.START-df.END) ==20

本身返回一個序列。 本系列是您尋求的專欄:

>>> df = pd.DataFrame([[100,120],[110,115]],index=['AB','CC'],columns=['START','END'])
... df
... abs(df.START-df.END)==20
13: AB     True
CC    False
dtype: bool

注意:

>>> df['New'] = abs(df.START-df.END)==20
>>> df
15:     START  END    New
AB    100  120   True
CC    110  115  False

熊貓就是為這種操作而設計的。

您不應灰心,因為您的兩次嘗試都非常接近:

df['New']= df.apply(lambda x: 1 if abs(df.START-df.END)==20 else 0)

被破壞,因為abs(df.START-df.END)== 20返回一個Series。 對於每一行,該lambda會詢問Series是否為True,因此會出現錯誤。

如果相反,您有:

df['New']= df.apply(lambda x: 1 if abs(x.START-x.END)==20 else 0, axis =1)

這將產生所需的結果,因為abs(x.START-x.END)== 20返回布爾值,而不是序列。

怎么樣:

df.loc[:,'Flag'] = abs(df.START-df.END)==20

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM