簡體   English   中英

在多種條件下過濾 Pandas 數據框

[英]Filter Pandas Dataframe Under Multiple Conditions

我目前的進度

我目前有一個帶有 5 個不同實例的熊貓數據框

df = {

'Name': ['John', 'Mark', 'Kevin', 'Ron', 'Amira'

'ID': [110,111,112,113,114]

'Job title': ['xox','xoy','xoz','yow','uyt']

'Manager': ['River' 'Trevor', 'John', 'Lydia', 'Connor']

'M2': ['Shaun', 'Mary', 'Ronald', 'Cary', 'Miranda']

'M3': ['Clavis', 'Sharon', 'Randall', 'Mark', Doug']

'M4': ['Pat', 'Karen', 'Brad', 'Chad', 'Anita']

'M5': ['Ty', 'Jared', 'Bill', 'William', 'Bob']

'Location': ['US', 'US', 'JP', 'CN', 'JA']

}

list = ['River', 'Pat', 'Brad', 'William', 'Clogah']

我需要過濾並刪除 pandas 數據框中包含列表中 0 個值的所有行,以及包含列表中多個值的行。 在上述情況下,將刪除第 1 行和第 2 行中的實例,因為列表中的特定行中有兩個名稱。

在第 1 行,即(1:'John'、110、'xox、'River'、'Shaun'、'Clavis'、'Pat'、'Ty'、'US'):見下文 -> 因為它會被刪除'River' 和 'Pat' 都在列表中

在第 2 行,即(2:'Mark'、111、'xoy、'Trevor'、'Mary'、'Sharon'、'Karen'、'Jared'、'US'):見下文 -> 因為它會被刪除'Trevor' 和 'Jared' 都在列表中

在第 5 行,即(5:'Amira'、114、'uyt'、'Connor'、'Miranda'、'Doug'、'Anita'、'Bob'、'JA'):見下文 -> 將被刪除因為該行不包含我列表中的任何值。

另外兩個實例將被保留。

原版印刷DF

0:“姓名”、“ID”、“職務”、“經理”、“M2”、“M3”、“M4”、“M5”、“位置”

1:“約翰”、110、“xox”、“里弗”、“肖恩”、“克拉維斯”、“帕特”、“泰”、“美國”

2:“馬克”、111、“xoy”、“特雷弗”、“瑪麗”、“莎朗”、“凱倫”、“傑瑞德”、“美國”

3:“凱文”、112、“xoz”、“約翰”、“羅納德”、“蘭德爾”、“布拉德”、“比爾”、“JP”

4:'羅恩',113,'yow','Lydia','Cary','Mark','Chad','William','CN'

5:“阿米拉”、114、“uyt”、“康納”、“米蘭達”、“道格”、“安妮塔”、“鮑勃”、“賈”

過濾印刷DF

3:'凱文',112,'xoz,'約翰','羅納德','蘭德爾','布拉德','比爾','JP',

4:'羅恩',113,'yow','Lydia','Cary','Mark','Chad','William','CN',

當前流程僅過濾掉不包含等於我的經理列表中任何值的值的行。 我想保留列表中一位經理的行,但不保留列表中沒有經理的行

干得好:

import pandas as pd

df = pd.DataFrame({'Name': ['John', 'Mark', 'Kevin', 'Ron', 'Amira'],
                   'ID': [110, 111, 112, 113, 114],
                   'Job title': ['xox', 'xoy', 'xoz', 'yow', 'uyt'],
                   'Manager': ['River', 'Trevor', 'John', 'Lydia', 'Connor'],
                   'M2': ['Shaun', 'Mary', 'Ronald', 'Cary', 'Miranda'],
                   'M3': ['Clavis', 'Sharon', 'Randall', 'Mark', 'Doug'],
                   'M4': ['Pat', 'Karen', 'Brad', 'Chad', 'Anita'],
                   'M5': ['Ty', 'Jared', 'Bill', 'William', 'Bob'],
                   'Location': ['US', 'US', 'JP', 'CN', 'JA']}
                  )
managers = ['River', 'Pat', 'Trevor', 'Jared', 'Connor']

mask = df.applymap(lambda x: x in managers)
filtered_df = df[mask.values.sum(axis=1) < 2]

print(filtered_df)

過濾 0 (所以只有 1 個經理會留下):

filtered_df = df[mask.values.sum(axis=1) == 1]

不是實現這一目標的最漂亮方法,但這將起作用:

d = {
    "Name": ["John", "Mark", "Kevin", "Ron", "Amira"],
    "ID": [110, 111, 112, 113, 114],
    "Job title": ["xox", "xoy", "xoz", "yow", "uyt"],
    "M1": ["River", "Trevor", "John", "Lydia", "Connor"],
    "M2": ["Shaun", "Mary", "Ronald", "Cary", "Miranda"],
    "M3": ["Clavis", "Sharon", "Randall", "Mark", "Doug"],
    "M4": ["Pat", "Karen", "Brad", "Chad", "Anita"],
    "M5": ["Ty", "Jared", "Bill", "William", "Bob"],
    "Location": ["US", "US", "JP", "CN", "JA"],
}
df = pd.DataFrame(d)

# Isolate managers in their own DataFrame
managers = ["River", "Pat", "Trevor", "Jared", "Connor"]
df_managers = df[["M1", "M2", "M3", "M4", "M5"]]

# Assess any one employee has less than two managers and isolate those employees
less_than_two_managers = []
for i in range(df_managers.shape[0]):
    if len(set(df_managers.iloc[i]).intersection(set(managers))) < 2:
        less_than_two_managers.append(True)
    else:
        less_than_two_managers.append(False)

df["LT two managers"] = less_than_two_managers
df[df["LT two managers"] == True]

使用掩碼的矢量解:

m = (df.filter(regex=r'^M')
       .apply(lambda s: s.isin(lst))
       .sum(1).eq(1)
    )

out = df.loc[m]

輸出:

    Name   ID Job title Manager      M2       M3    M4       M5 Location
2  Kevin  112       xoz    John  Ronald  Randall  Brad     Bill       JP
3    Ron  113       yow   Lydia    Cary     Mark  Chad  William       CN

暫無
暫無

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

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