根据现有的DataFrame是否出现在列表中,从现有的DataFrame中创建一个新的pandas DataFrame。

问题描述 投票:0回答:1

我希望能够接受一个有多重索引的大型 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循环的效率太低了

python pandas dataframe multi-index
1个回答
0
投票

使用, 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
© www.soinside.com 2019 - 2024. All rights reserved.