为了账号安全,请及时绑定邮箱和手机立即绑定

使用多索引 pandas 数据框

使用多索引 pandas 数据框

RISEBY 2022-04-23 21:20:01
我正在使用多索引数据框,但在尝试过滤/更新其值时遇到了一些问题。我需要的:将“名称 1”、“名称 2”等更改为大写例如,获取 {Group 1+ A} 中值为 1 的所有名称选择后获取上一步中的名称列表(NAME 1、NAME 2等)如果我也可以将此 MultiIndex 数据帧转换为“正常”数据帧,那也可以。示例代码:import pandas as pdsample_file = '.../Sample.xlsx'excel_file = pd.ExcelFile(sample_file)df = excel_file.parse(header=[0, 1], index_col=[0], sheet_name=0)# Upper case columnsc_cols = licensing_df.columns.get_level_values(0).str.upper()s_cols = licensing_df.columns.get_level_values(1).str.upper()licensing_df.columns = pd.MultiIndex.from_arrays([c_cols, s_cols])# TODO: step 1# Step 2valid = df[df[('GROUP 1', 'A')] == 1]# TODO: Step 3这是数据框的示例图片:
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

使用您的excel文件:


df = pd.read_excel('Downloads/Sample.xlsx', header=[0,1], index_col=0)

df

输出:


Lists  Group 1                                         ... Group 2                                         

Name        AR   AZ   CA   CO  CT   FL  GA   IL IN KY  ...      SC  SD   TN   TX   UT   VA WA   WI  WV   WY

Name 1     NaN  1.0  1.0  1.0 NaN  1.0 NaN  NaN  1  1  ...       1 NaN  1.0  1.0  1.0  1.0  1  1.0 NaN  1.0

Name 2     NaN  NaN  NaN  NaN NaN  1.0 NaN  1.0  1  1  ...       1 NaN  1.0  NaN  NaN  1.0  1  NaN NaN  NaN

Name 3     NaN  NaN  NaN  NaN NaN  NaN NaN  1.0  1  1  ...       1 NaN  NaN  NaN  NaN  NaN  1  NaN NaN  NaN


[3 rows x 72 columns]

待办事项 #1

df.index = df.index.str.upper()

df

输出:


Lists  Group 1                                         ... Group 2                                         

Name        AR   AZ   CA   CO  CT   FL  GA   IL IN KY  ...      SC  SD   TN   TX   UT   VA WA   WI  WV   WY

NAME 1     NaN  1.0  1.0  1.0 NaN  1.0 NaN  NaN  1  1  ...       1 NaN  1.0  1.0  1.0  1.0  1  1.0 NaN  1.0

NAME 2     NaN  NaN  NaN  NaN NaN  1.0 NaN  1.0  1  1  ...       1 NaN  1.0  NaN  NaN  1.0  1  NaN NaN  NaN

NAME 3     NaN  NaN  NaN  NaN NaN  NaN NaN  1.0  1  1  ...       1 NaN  NaN  NaN  NaN  NaN  1  NaN NaN  NaN


[3 rows x 72 columns]

待办事项 #2

df[df.loc[:, ('Group 1', 'AZ')] == 1].index.to_list()

输出:


['NAME 1']

待办事项 #3

df[df.loc[:, ('Group 1', 'IL')] == 1].index.to_list()

输出:


['NAME 2', 'NAME 3']


查看完整回答
反对 回复 2022-04-23
?
慕工程0101907

TA贡献1887条经验 获得超5个赞

由于您没有提供输入样本,因此我只能假设您要达到的目标。


如果您尝试使用 MultIndex 选择和修改特定行,您可以使用 .loc 运算符和您在 MultiIndex 中指定的相应元组,例如


df.loc['Name1', ('GROUP 1', 'A')]

让我们模拟一些数据...


index = pd.MultiIndex.from_product([[2013, 2014], [1, 2]],

                                    names=['year', 'visit'])

columns = pd.MultiIndex.from_product([['Bob', 'Guido', 'Sue'], ['HR', 'Temp']],

                                      names=['subject', 'type'])

data=np.array(list(string.ascii_lowercase))[:24].reshape((4, 6))


df = pd.DataFrame(

    columns=columns,

    index=index,

    data=data

)

这是我们的 MultiIndex 数据帧:


subject    Bob      Guido      Sue     

type        HR Temp    HR Temp  HR Temp

year visit                             

2013 1       a    b     c    d   e    f

     2       g    h     i    j   k    l

2014 1       m    n     o    p   q    r

     2       s    t     u    v   w    x

让我们选择第一行并将字母更改为大写...


df.loc[(2013, 1)].str.upper()

...同样对于第一列...


df.loc[('Bob', 'HR')].str.upper()

...最后我们选择一个特定的单元格


df.loc[(2014, 1), ('Guido', 'HR')].upper()

返回


'O'

我希望这能让您了解如何使用 .loc 运算符....


查看完整回答
反对 回复 2022-04-23
  • 2 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信