Python 使用pd.dataframe.isin()通过多个条件获取新的dataframe
我正在尝试编写一个函数,该函数获取一个df和一个将列映射到值的字典。函数对行(索引)进行切片,以便只返回值与“条件”键值匹配的行。 例如:Python 使用pd.dataframe.isin()通过多个条件获取新的dataframe,python,pandas,dataframe,Python,Pandas,Dataframe,我正在尝试编写一个函数,该函数获取一个df和一个将列映射到值的字典。函数对行(索引)进行切片,以便只返回值与“条件”键值匹配的行。 例如: df_isr13=filterby_标准(df,{“地区”:[“美国”],“年份”:[2013]})输出中仅包含“年份”=2013和“地区”=“美国”的行 我试过: def filterby_criteria(df, criteria): for key, values in criteria.items(): return df[d
df_isr13=filterby_标准(df,{“地区”:[“美国”],“年份”:[2013]})
输出中仅包含“年份”=2013
和“地区”=“美国”
的行
我试过:
def filterby_criteria(df, criteria):
for key, values in criteria.items():
return df[df[key].isin(values)]
但我只得到第一个标准
如何通过
pd.dataframe.isin()
获取除所有标准之外的新数据帧?您可以使用for循环并通过pandas merge函数添加每个标准:
def filterby_criteria(df, criteria):
for key, values in criteria.items():
df = pd.merge(df[df [key].isin(values)], df, how='inner')
return df
考虑两个数据帧的简单合并,因为默认情况下
merge
使用所有匹配的名称:
from itertools import product
import pandas as pd
def filterby_criteria(df, criteria):
# EXTRACT DICT ITEMS
k,v = criteria.keys(), criteria.values()
# BUILD DF OF ALL POSSIBLE MATCHES
all_matches = (pd.DataFrame(product(*v))
.set_axis(list(k), axis='columns', inplace=False)
)
# RETURN MERGED DF
return df.merge(all_matches)
要使用随机种子数据演示: 数据
import numpy as np
import pandas as pd
np.random.seed(61219)
tools = ['sas', 'stata', 'spss', 'python', 'r', 'julia']
years = list(range(2013, 2019))
random_df = pd.DataFrame({'Tool': np.random.choice(tools, 500),
'Int': np.random.randint(1, 10, 500),
'Num': np.random.uniform(1, 100, 500),
'Year': np.random.choice(years, 500)
})
print(random_df.head(10))
# Tool Int Num Year
# 0 spss 4 96.465327 2016
# 1 sas 7 23.455771 2016
# 2 r 5 87.349825 2014
# 3 julia 4 18.214028 2017
# 4 julia 7 17.977237 2016
# 5 stata 3 41.196579 2013
# 6 stata 8 84.943676 2014
# 7 python 4 60.576030 2017
# 8 spss 4 47.024075 2018
# 9 stata 3 87.271072 2017
函数调用
criteria = {"Tool":["python", "r"], "Year":[2013, 2015]}
def filterby_criteria(df, criteria):
k,v = criteria.keys(), criteria.values()
all_matches = (pd.DataFrame(product(*v))
.set_axis(list(k), axis='columns', inplace=False)
)
return df.merge(all_matches)
final_df = filterby_criteria(random_df, criteria)
输出
print(final_df)
# Tool Int Num Year
# 0 python 8 96.611384 2015
# 1 python 7 66.782828 2015
# 2 python 9 73.638629 2015
# 3 python 4 70.763264 2015
# 4 python 2 28.311917 2015
# 5 python 3 69.888967 2015
# 6 python 8 97.609694 2015
# 7 python 3 59.198276 2015
# 8 python 3 64.497017 2015
# 9 python 8 87.672138 2015
# 10 python 9 33.605467 2015
# 11 python 8 25.225665 2015
# 12 r 3 72.202364 2013
# 13 r 1 62.192478 2013
# 14 r 7 39.264766 2013
# 15 r 3 14.599786 2013
# 16 r 4 22.963723 2013
# 17 r 1 97.647922 2013
# 18 r 5 60.457344 2013
# 19 r 5 15.711207 2013
# 20 r 7 80.273330 2013
# 21 r 7 74.190107 2013
# 22 r 7 37.923396 2013
# 23 r 2 91.970678 2013
# 24 r 4 31.489810 2013
# 25 r 1 37.580665 2013
# 26 r 2 9.686955 2013
# 27 r 6 56.238919 2013
# 28 r 6 72.820625 2015
# 29 r 3 61.255351 2015
# 30 r 4 45.690621 2015
# 31 r 5 71.143601 2015
# 32 r 6 54.744846 2015
# 33 r 1 68.171978 2015
# 34 r 5 8.521637 2015
# 35 r 7 87.027681 2015
# 36 r 3 93.614377 2015
# 37 r 7 37.918881 2015
# 38 r 3 7.715963 2015
# 39 python 1 42.681928 2013
# 40 python 6 57.354726 2013
# 41 python 1 48.189897 2013
# 42 python 4 12.201131 2013
# 43 python 9 1.078999 2013
# 44 python 9 75.615457 2013
# 45 python 8 12.631277 2013
# 46 python 9 82.227578 2013
# 47 python 7 97.802213 2013
# 48 python 1 57.103964 2013
# 49 python 1 1.941839 2013
# 50 python 3 81.981437 2013
# 51 python 1 56.869551 2013
(点击顶部的运行)类似于
标准={“地区”:[“美国”],“年份”:[2013]};df[np.logical_和.reduce(df[k].isin(v)代表k,v在criteria.items()中]
?在循环中不应增长对象,包括使用合并,concat
,附加
内部循环。这会导致在内存中过度复制。@Parfait是绝对正确的。这是一个糟糕的答案。