簡體   English   中英

基於最近日期和活動狀態返回行的 Python 函數

[英]Python function to return row by based on most recent date, and active status

我在 Pandas 中有一個這樣格式的數據框。

(df)
School ID      Num          Column 1     Column 2      Status       Modified Date
School 1       6000         NaN          NaN           Active       2020-07-18
School 2       3000TO4000   3000         4000          InActive     2020-09-05
School 3       9-999        NaN          NaN           Active       2020-03-30
School 4       8000TO9000   8000         9000          Active       2020-12-14
School 5       9-999        NaN          NaN           InActive     2020-10-21
....

我正在嘗試創建一個函數,當輸入一個數字時,它將檢查第 1 列(字符串類型)以查看是否存在直接匹配,然后返回該學校 ID。 如果不是,它將檢查該數字是否在第 1 列和第 2 列(浮點數)中的兩個數字之間。

但是,在某些情況下,第 1 列中存在重復數字。因此,如果輸入 9-999,將返回 Schools 3 和 Schools 5。

我需要創建一個對該結果進行排序的函數,並且只返回具有最近修改日期的值,並且狀態是否處於活動狀態。

因此,如果輸入 9-999,將返回此結果。

School ID      Num          Column 1     Column 2      Status       Modified Date
School 3       9-999        NaN          NaN           Active       2020-03-30

如果輸入 8099,將返回:

School ID      Num          Column 1     Column 2      Status       Modified Date
School 4       8000TO9000   8000         9000          Active       2020-12-14

這是我現在擁有的代碼,僅用於查找 Num 與第 1 列和第 2 列之間的匹配項,但不考慮重復項。 我更喜歡使用排序功能,但我不確定如何使用。

s = '#Num'

q = df[df['School ID']==str(s)]

if len(q):
    print(q)
else:
    s = float(s)
    m = df[['Column 1', 'Column 2']].apply(lambda x: x['Column 1'] <= s <= x['Column 2'], axis=1)
    print(df[m])

謝謝您的幫助。

也許這會解決你的問題。 我通過使用 pandas 的loc函數使它更簡單一些。

import pandas as pd
import numpy as np


d = {'School ID': ["School 1", "School 2", "School 3", "School 4", "School 5"], 
    'Num': ["6000", "3000TO4000", "9-999", "8000TO9000", "9-999"], 
    'Column 1' : [np.NaN, 3000, np.NaN, 8000, np.NaN], 
    'Column 2' : [np.NaN, 4000, np.NaN, 9000, np.NaN], 
    'Status' : ['Active', 'InActive', 'Active', 'Active', 'InActive']}

df = pd.DataFrame(data=d)


search = "9-999"

try:
    int(search)
    check_col = df.loc[(df['Column 1'] <= int(search)) &  (df['Column 2'] >= int(search)) & (df['Status'] == 'Active')]
    if len(check_col) > 0:
        print(check_col)

except:
    pass

check_num = df.loc[(df['Status'] == 'Active') & (df['Num'] == str(search))]

if len(check_num) > 0:
        print(check_num)

暫無
暫無

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

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