gpt4 book ai didi

python - 过滤具有 2 级列标题的 Pandas 数据框

转载 作者:行者123 更新时间:2023-12-03 20:22:50 25 4
gpt4 key购买 nike

我正在尝试以相当标准的方式使用列表过滤具有 2 级列标题的 Pandas 数据框 isin和一个掩码来重新调整一个新的过滤数据帧。但是,我一直遇到围绕重叠索引名称的值错误,我似乎无法解决。
以下是我要过滤的列表以及数据框本身的示例。不确定如何提供生成此数据帧所需的代码,因为它是从 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)

关于python - 过滤具有 2 级列标题的 Pandas 数据框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67829048/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com