考虑以下数据帧。
import Pandas as pd
df = pd.Dataframe
df = pd.DataFrame()
df['Folder'] = [2,3,4,5 ,2,4,5, 2,3,4, 2,3,4,5,1]
df['Country'] = ['USA','USA','USA','USA' ,'Mexico','Mexico','Mexico', 'UK','UK','UK', 'Canada','Canada','Canada','Canada','Canada']
df['Data'] = [20,30,43,15 ,25,44,15, 26,37,47, 24,34,47,55,18]
df.set_index(['Country','Folder'], drop=True, inplace=True)
df
Data
Country Folder
USA 2 20
3 30
4 43
5 15
Mexico 2 25
4 44
5 15
UK 2 26
3 37
4 47
Canada 2 24
3 34
4 47
5 55
1 18
如何收集Folder级别中所有lst = [1,3,4]的行?
Data
Country Folder
Canada 2 24
3 34
4 47
5 55
1 18
或者
Data
Country Folder
Canada 3 34
4 47
1 18
要么为我工作。我想知道加拿大符合所有第一名。最早可能长达8个项目。
我试过df.query(“ @ lst中的文件夹”),但是返回与lst匹配的行。我需要匹配所有的lst。
在此先感谢您的帮助。
这是@jezrael的方法的替代方法,在该方法中,我们根据isin
和国家对布尔值进行分组:
In [38]: (df.groupby([df.index.isin([1,3,4], level='Folder'),
df.index.get_level_values('Country')])
.filter(lambda x: len(x)==3)
)
Out[38]:
Data
Country Folder
Canada 3 34
4 47
1 18
利用以下事实:列表中有三个数字,因此,如果所有数字都匹配,则应为3。
要获取所有值,可以对步骤进行分块:
mapping = df.index.isin([1,3,4], level = 'Folder')
filtered = (pd.Series(mapping)
.groupby(df.index.get_level_values('Country'))
.transform(lambda x: sum(x)>=3)
)
In [61]: df.loc[filtered.array]
Out[61]:
Data
Country Folder
Canada 2 24
3 34
4 47
5 55
1 18
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句