簡體   English   中英

當pandas中的列滿足某個條件時如何拉第一個實例?

[英]How to pull the first instance when a column satisfies a certain condition in pandas?

我正在嘗試將第一個實例中的帳戶余額等於或低於 0。在下面的示例中,我想創建一個列,其中只有 X 和 Y 從正數移動到低於或等於 0 的行,即 X將是第 4 行中的 2017-1-4,而 Y 將是第 8 行中的 2018-2-3。

df= pd.DataFrame()
df['Account'] = ['X','X','X','X','X','Y','Y','Y']
df['Balance'] = [100,90,80,0,0,900,90,-1]
df['Date'] = [pd.to_datetime('2017-1-1'),pd.to_datetime('2017-1-2'),pd.to_datetime('2017-1-3'),pd.to_datetime('2017-1-4'),pd.to_datetime('2017-1-5'),pd.to_datetime('2018-2-1'),pd.to_datetime('2018-2-2'),pd.to_datetime('2018-2-3')]
print(df)

謝謝!

編輯:我認為我可能正在尋找的答案是這樣的

x = df.groupby('Account')['Balance']\
       .apply(lambda x: (x<=0) & (0<x.shift()))

這將在余額變為 0 或更少時返回實例,並與之前的情況進行比較。 但是,當我嘗試獲取日期信息時,它給了我一個我沒有得到的數字:

y = np.where(x,df['Date'],pd.NaT)

數組([NaT,NaT,NaT,1483488000000000000,NaT,NaT,NaT,1517616000000000000],dtype = 對象)

我該如何解決這個問題? Python 和 Pandas 仍然很新,所以可能很明顯!

一種可能的解決方案是使用 df.values,它將 dataframe 作為 numpy 數組 object 返回。 然后,您可以使用 for 循環的組合來遍歷 dataframe 的每一行並檢查 account == X 或 Y 和 Balance <= 0,如果是,則返回日期:

def zero_bal(a, df=df):
    for each in df.values:
        if each[0] == a and each[1] <= 0:
                return each[2]

X, Y = zero_bal('X'), zero_bal('Y')

在上面的代碼中,“for each in df.values:”中的“each”類似於:

['X', 80, 時間戳('2017-01-03 00:00:00')]

然后,您可以分別使用索引 each[0]、each[1] 和 each[2] 到 select 帳戶、余額和日期,並檢查它們是否是您要查找的內容。

您可以將 boolean 掩碼直接應用於 dataframe,如下所示: x = df.groupby('Account')['Balance'].apply(lambda x: (x<=0) & (0<x.shift()))

df[x]df[x]['column_name_that_you_need']

暫無
暫無

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

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