[英]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.