我希望能够接受一个有多重索引的大型 DataFrame,并根据索引是否出现在列表中创建两个新的索引。
举个例子,假设我有一个DataFrame,它的MultiIndex为 ['Name', 'Surname']
和不同测试结果的列 ['Score1', 'Score2']
.给定一个名字列表,我希望能够创建两个新的DataFrames,一个包含名字在列表中的条目,另一个名字不在列表中。
In [1]:
data = {'Name':['Jake', 'Jack', 'June', 'Jane'],
'Surname': ['Scott', 'Smith', 'Saint', 'Smith'],
'Score1':[85, 78, 95, 90],
'Score2': [79, 91, 83, 68]}
df = pd.DataFrame(data)
df = df.set_index(['Name', 'Surname'])
Males = [['Jake', 'Scott'], ['Jack', 'Smith']]
df
Out [1]:
Score1 Score2
Name Surname
Jake Scott 85 79
Jack Smith 78 91
June Saint 95 83
Jane Smith 90 68
然后,如果一行索引在 Males
它将被投入 MalesDF
否则就会被放进 FemalesDF
In [2]: MalesDF
Out [2]:
Score1 Score2
Name Surname
Jake Scott 85 79
Jack Smith 78 91
显然,在这个小例子中,用for循环可能很简单,但在我的实际案例中,我有成千上万的名字和一个大小只有四分之一的列表。所以for循环的效率太低了
使用, index.isin
来创建一个布尔掩码,并根据这个布尔掩码过滤df来创建男性和女性df。
m = df.index.isin(Males)
df_males = df[m]
df_females = df[~m]
结果:
# df_males
Score1 Score2
Name Surname
Jake Scott 85 79
Jack Smith 78 91
# df_females
Score1 Score2
Name Surname
June Saint 95 83
Jane Smith 90 68