【问题标题】:arithmetic on pandas dataframe row-wise逐行计算熊猫数据帧
【发布时间】:2019-08-09 17:15:34
【问题描述】:

df 有:

    A   B  C
a   1   2  3
b   2   1  4
c   1   1  1

df 想要:

    A   B  C
a   1   2  3
b   2   1  4
c   1   1  1
d   1  -1  1

我可以通过以下方式获得 df want:

df.loc['d']=df.loc['b']-df.loc['a']

但是,我的实际 df 具有多个 ID 'X'、'Y' 等的 'a'、'b'、'c' 行。

        A   B  C
  X a   1   2  3
    b   2   1  4
    c   1   1  1
  Y a   1   2  3
    b   2   1  4
    c   1   1  1

如何创建具有多个 ID 的相同输出? 我原来的方法:

df.loc['d']=df.loc['b']-df.loc['a']

失败 KeyError:'b'

期望的输出:

        A   B  C
  X a   1   2  3
    b   2   1  4
    c   1   1  1
    d   1  -1  1
  Y a   1   2  3
    b   2   2  4
    c   1   1  1
    d   1   0  1

【问题讨论】:

  • 这是一个多索引。您需要同时提供索引的较高级别和较低级别来解析行

标签: python pandas dataframe multi-index


【解决方案1】:

IIUC,

for i, sub in df.groupby(df.index.get_level_values(0)):
  df.loc[(i, 'd'), :] = sub.loc[(i,'b')] - sub.loc[(i, 'a')]

print(df.sort_index())

或许

k = df.groupby(df.index.get_level_values(0), as_index=False).apply(lambda s: pd.DataFrame([s.loc[(s.name,'b')].values - s.loc[(s.name, 'a')].values], 
                                                                                      columns=s.columns, 
                                                                                      index=pd.MultiIndex(levels=[[s.name], ['d']], codes=[[0],[0]])
                                                                                      )).reset_index(drop=True, level=0)

pd.concat([k, df]).sort_index()

【讨论】:

    【解决方案2】:

    如果您想在多索引的特定级别上进行操作,数据重塑是一个有用的技巧。请参阅下面的代码,

    result = (df.unstack(0).T
                .assign(d=lambda x:x.b-x.a)
                .stack()
                .unstack(0))
    

    【讨论】:

      【解决方案3】:

      使用pd.IndexSliceab 进行切片。将brename 上的diffslice 呼叫到d。最后追加到原来的df

      idx = pd.IndexSlice
      df1 = df.loc[idx[:,['a','b']],:].diff().loc[idx[:,'b'],:].rename({'b': 'd'})
      df2 = df.append(df1).sort_index().astype(int)
      
      Out[106]:
           A  B  C
      X a  1  2  3
        b  2  1  4
        c  1  1  1
        d  1 -1  1
      Y a  1  2  3
        b  2  2  4
        c  1  1  1
        d  1  0  1
      

      【讨论】:

        猜你喜欢
        • 2017-12-29
        • 1970-01-01
        • 2013-12-20
        • 1970-01-01
        • 1970-01-01
        • 2022-11-14
        • 2014-01-08
        • 1970-01-01
        • 2021-06-23
        相关资源
        最近更新 更多