![](/img/trans.png)
[英]Subtracting minimum values of a certain pandas dataframe column based on another column
[英]Subtracting columns based on key column in pandas dataframe
我有兩個數據框看起來像
df1:
ID A B C D
0 'ID1' 0.5 2.1 3.5 6.6
1 'ID2' 1.2 5.5 4.3 2.2
2 'ID1' 0.7 1.2 5.6 6.0
3 'ID3' 1.1 7.2 10. 3.2
df2:
ID A B C D
0 'ID1' 1.0 2.0 3.3 4.4
1 'ID2' 1.5 5.0 4.0 2.2
2 'ID3' 0.6 1.2 5.9 6.2
3 'ID4' 1.1 7.2 8.5 3.0
df1 可以有多個具有相同ID
條目,而每個ID
在 df2 中只出現一次。 也並非 df2 中的所有ID
都必須出現在 df1 中。 我無法通過使用set_index()
解決此問題,因為 df1 中的多行可以具有相同的ID
,並且 df1 和 df2 中的ID
未對齊。
我想創建一個新的數據框,我從df1[['A','B','C','D']]
減去df2[['A','B','C','D']]
df1[['A','B','C','D']]
基於匹配的 ID。
生成的數據框如下所示:
df_new:
ID A B C D
0 'ID1' -0.5 0.1 0.2 2.2
1 'ID2' -0.3 0.5 0.3 0.0
2 'ID1' -0.3 -0.8 2.3 1.6
3 'ID3' 0.5 6.0 1.5 0.2
我知道如何用循環來做到這一點,但由於我正在處理大量數據,這根本不切實際。 用 Pandas 解決這個問題的最佳方法是什么?
你只需要 set_index 和減去
(df1.set_index('ID')-df2.set_index('ID')).dropna(axis=0)
Out[174]:
A B C D
ID
'ID1' -0.5 0.1 0.2 2.2
'ID1' -0.3 -0.8 2.3 1.6
'ID2' -0.3 0.5 0.3 0.0
'ID3' 0.5 6.0 4.1 -3.0
如果訂單很重要,請為 df2 添加reindex
(df1.set_index('ID')-df2.set_index('ID').reindex(df1.ID)).dropna(axis=0).reset_index()
Out[211]:
ID A B C D
0 'ID1' -0.5 0.1 0.2 2.2
1 'ID2' -0.3 0.5 0.3 0.0
2 'ID1' -0.3 -0.8 2.3 1.6
3 'ID3' 0.5 6.0 4.1 -3.0
類似於 Wen (誰打敗了我)提出的,您可以使用pd.DataFrame.subtract
:
df1.set_index('ID').subtract(df2.set_index('ID')).reset_index()
A B C D
ID
'ID1' -0.5 0.1 0.2 2.2
'ID1' -0.3 -0.8 2.3 1.6
'ID2' -0.3 0.5 0.3 0.0
'ID3' 0.5 6.0 4.1 -3.0
一種方法是使用numpy
。 我們可以使用numpy.searchsorted
從df2
提取所需的有序索引。
然后將其輸入到新數據幀的構建中。
idx = np.searchsorted(df2['ID'], df1['ID'])
res = pd.DataFrame(df1.iloc[:, 1:].values - df2.iloc[:, 1:].values[idx],
index=df1['ID']).reset_index()
print(res)
ID 0 1 2 3
0 'ID1' -0.5 0.1 0.2 2.2
1 'ID2' -0.3 0.5 0.3 0.0
2 'ID1' -0.3 -0.8 2.3 1.6
3 'ID3' 0.5 6.0 4.1 -3.0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.