簡體   English   中英

大熊貓數據幀的逐行算術

[英]arithmetic on pandas dataframe row-wise

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 想要的:

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

國際大學聯盟,

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()

如果您想對多索引的特定級別進行操作,數據整形是一個有用的技巧。 看下面的代碼,

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

使用pd.IndexSliceab進行切片。 b上調用diffslice renamerenamed 最后,將其附加到原始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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM