【问题标题】:Split DataFrame column into two + MultiIndex将 DataFrame 列拆分为两个 + MultiIndex
【发布时间】:2019-04-05 20:23:02
【问题描述】:

我有 DataFrame 代表人们跨越国界

flows = DataFrame([[1,2],[3,4]], index=['Monday', 'Tuesday'], columns=['CZ>DE', 'HU>AT'])

         CZ>DE  HU>AT
Monday       1      2
Tuesday      3      4

我想将每一列分成两列,代表每个边界的国家/地区增量/减量。我当前的代码和期望的结果是这样的

country_from = lambda x: x[:2]
country_to = lambda x: x[3:]
flows_from = -1*flows.copy()
flows_from.columns = pd.MultiIndex.from_tuples([(border, country_from(border)) for border in flows.columns])
flows_to = flows.copy()
flows_to.columns = pd.MultiIndex.from_tuples([(border, country_to(border)) for border in flows.columns])
country_flows = pd.concat([flows_from, flows_to], axis=1)
country_flows = country_flows.groupby(level=[0,1], axis=1).sum()

           CZ>DE    HU>AT   
           CZ DE    AT HU
Monday     -1  1     2 -2
Tuesday    -3  3     4 -4 

这个解决方案相当冗长,我怀疑它可以做得更好。有人有想法吗?

【问题讨论】:

    标签: python pandas numpy dataframe multi-index


    【解决方案1】:

    您可以创建定义 MultiIndex 级别的元组:

    tuples = [(i,k) for i, j in zip(flows.columns,[i.split('>') for i in flows.columns]) for k in j]
    
    x = flows.values
    

    然后:

    data = np.multiply(np.tile([-1,1], x.shape), np.repeat(x, 2, axis=1))
    
    pd.DataFrame(data=data, index=flows.index, columns=pd.MultiIndex.from_tuples(tuples))
    

    产量:

            CZ>DE    HU>AT   
               CZ DE    HU AT
    Monday     -1  1    -2  2
    Tuesday    -3  3    -4  4
    

    【讨论】:

      【解决方案2】:

      好的,在python/pandas: how to combine two dataframes into one with hierarchical column index? 受到启发后,我通过连接 DataFrames 字典解决了这个问题。拥有我原来的映射 lambda 函数

      country_from = lambda x: x[:2]
      country_to = lambda x: x[3:]
      

      一行就可以得到结果

      pd.concat({col:pd.DataFrame({country_from(col):-1*flows[col], country_to(col):flows[col]}) for col in flows.columns}, axis=1)
      
                 CZ>DE    HU>AT   
                 CZ DE    AT HU
      Monday     -1  1     2 -2
      Tuesday    -3  3     4 -4
      

      【讨论】:

        猜你喜欢
        • 2020-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-03
        • 1970-01-01
        • 2017-04-28
        • 2022-01-14
        • 1970-01-01
        相关资源
        最近更新 更多