[英]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.IndexSlice
對a
和b
進行切片。 在b
上調用diff
和slice
rename
其rename
為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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.