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