【问题标题】:Assign value based on conditional of two multiindex columns in Pandas根据 Pandas 中两个多索引列的条件赋值
【发布时间】:2021-10-11 00:39:33
【问题描述】:

目标是根据列的条件(AB)创建一个新的多索引列(stat

A 的条件

CONDITION_A='n'if A<0 else 'p'

B 的条件

CONDITION_B='l'if A<0 else 'g'

目前的思路是分别分析条件AB,结合分析得到stat列如下,最后追加回主dataframe。

但是,我想知道是否有一种方法可以最大化代码行以实现类似的目标

预期输出

import pandas as pd
import numpy as np

np.random.seed(3)
arrays = [np.hstack([['One']*2, ['Two']*2]) , ['A', 'B', 'A', 'B']]
columns = pd.MultiIndex.from_arrays(arrays)
df=  pd.DataFrame(np.random.randn(5, 4), columns=list('ABAB'))

df.columns = columns
idx = pd.IndexSlice
mask_1 = df.loc[:,idx[:,'A']]<0
appenddf=mask_1.replace({True:'N',False:'P'}).rename(columns={'A':'iii'},level=1)


mask_2 = df.loc[:,idx[:,'B']]<0
appenddf_2=mask_2.replace({True:'l',False:'g'}).rename(columns={'A':'iv'},level=1)

# combine the multiindex
stat_comparison=[''.join(i) for i in zip(appenddf["iii"],appenddf_2["iv"])]

【问题讨论】:

    标签: python pandas multi-index


    【解决方案1】:

    您可以尝试连接两个 df:

    s=pd.concat([appenddf,appenddf_2],axis=1)
    cols=pd.MultiIndex.from_product([s.columns.get_level_values(0),['stat']])
    out=pd.concat([s.loc[:,(x,slice(None))].agg('_'.join,axis=1) for x in s.columns.get_level_values(0).unique()],axis=1,keys=cols)
    

    out的输出:

        One     Two
        stat    stat
    0   P_g     P_l
    1   N_l     N_l
    2   N_l     N_g
    3   P_g     P_l
    4   N_l     P_l
    

    【讨论】:

    • 这很棒。但是,如果您可以将此结果附加到原始df 中,这将是对未来读者的奖励,如图所示。
    • @balandongiv 使用df=pd.concat([df,out],axis=1).sort_index(axis=1)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-19
    • 1970-01-01
    • 2021-10-12
    • 2019-01-11
    • 2023-03-27
    • 2020-11-15
    相关资源
    最近更新 更多