我正在尝试使用相当标准的使用方式中的列表isin
和掩码来过滤具有 2 级列标题的 Pandas 数据框,以重新调整新的过滤数据框。但是,我一直遇到围绕重叠索引名称的值错误,我似乎无法解决。
以下是我要过滤的列表以及数据框本身的示例。不确定如何提供生成此数据帧所需的代码,因为它是从 csv 文件导入的。
my_list = ['DEF', 'GHI']
+------+--------+----------+---+----------+---+
| CODE | NAME | STANDARD | | ADVANCED | |
+------+--------+----------+---+----------+---+
| CODE | NAME | A | B | A | B |
+------+--------+----------+---+----------+---+
| ABC | APPLE | 1 | 1 | 2 | 2 |
| DEF | BANANA | 3 | 3 | 4 | 4 |
| GHI | KIWI | 5 | 5 | 6 | 6 |
| JKL | MANGO | 7 | 7 | 8 | 8 |
+------+--------+----------+---+----------+---+
运行以下行进行过滤
new_df = df[df['CODE'].isin(my_list)]
返回
ValueError: cannot join with no overlapping index names
但是,如果我自己运行df['CODE'].isin(my_list)
,这似乎可以工作并返回Symbol
带有 True/False 值的列,这意味着将掩码应用于原始数据帧时会出现问题。
df 源代码
[{('CODE', 'CODE'): 'ABC',
('NAME', 'NAME'): 'APPLE',
('STANDARD', 'A'): 1,
('STANDARD', 'B'): 1,
('ADVANCED', 'A'): 2,
('ADVANCED', 'B'): 2},
{('CODE', 'CODE'): 'DEF',
('NAME', 'NAME'): 'BANANA',
('STANDARD', 'A'): 3,
('STANDARD', 'B'): 3,
('ADVANCED', 'A'): 4,
('ADVANCED', 'B'): 4},
{('CODE', 'CODE'): 'GHI',
('NAME', 'NAME'): 'KIWI',
('STANDARD', 'A'): 5,
('STANDARD', 'B'): 5,
('ADVANCED', 'A'): 6,
('ADVANCED', 'B'): 6},
{('CODE', 'CODE'): 'JKL',
('NAME', 'NAME'): 'MANGO',
('STANDARD', 'A'): 7,
('STANDARD', 'B'): 7,
('ADVANCED', 'A'): 8,
('ADVANCED', 'B'): 8}]
看看是什么df['CODE'].isin(my_list)
产生的:
CODE
0 False
1 True
2 True
3 False
与单级索引相比:
my_list = ['DEF', 'GHI']
df = pd.DataFrame({
'CODE': ['ABC', 'DEF', 'GHI', 'JKL']
})
print(df['CODE'].isin(my_list))
0 False
1 True
2 True
3 False
Name: CODE, dtype: bool
使固定
要么从 CODE 中获取索引:
new_df = df[df['CODE'].isin(my_list)['CODE']]
或者直接引用 MultiIndex:
new_df = df[df[('CODE', 'CODE')].isin(my_list)]
两者都产生:
new_df
:
CODE NAME STANDARD ADVANCED
CODE NAME A B A B
1 DEF BANANA 3 3 4 4
2 GHI KIWI 5 5 6 6
完整的工作示例:
import pandas as pd
my_list = ['DEF', 'GHI']
df = pd.DataFrame({
('CODE', 'CODE'): ['ABC', 'DEF', 'GHI', 'JKL'],
('NAME', 'NAME'): ['APPLE', 'BANANA', 'KIWI', 'MANGO'],
('STANDARD', 'A'): [1, 3, 5, 7], ('STANDARD', 'B'): [1, 3, 5, 7],
('ADVANCED', 'A'): [2, 4, 6, 8], ('ADVANCED', 'B'): [2, 4, 6, 8]
})
new_df = df[df[('CODE', 'CODE')].isin(my_list)]
print(new_df)
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句