Pandas:如何从不同的 Dataframe 中逐行逐列地减去值

rdrgkggo  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(316)

使用Pandas Dataframe ,我如何基于'CUSIP'(作为唯一ID)求出 Dataframe 之间'(x$1000)'和'PRN AMT'列的差异?我提供的数据集是一个示例,因此解决方案必须能够应对不同的顺序。我尝试阅读dataframe.subtract()文档,但不知道如何将其应用于我的特定问题。
Dataframe 1:

CUSIP       (x$1000)     PRN AMT   TICKER                            
594918104  2765345852  2114080582   MSFT
037833100  1891440177  3058252946   AAPL
02079K305  1721936077   132543866  GOOGL
023135106  1341784239  2573051329   AMZN

Dataframe 2:

CUSIP       (x$1000)     PRN AMT   TICKER  
594918104  3034828140  1612323669   MSFT
037833100  2463247977  2628732382   AAPL
02079K305  2096049986    93429916  GOOGL
023135106  1581124222   118724459   AMZN
  • 所需输出:*
CUSIP       (x$1000)     PRN AMT   TICKER  
594918104  -269482288  501756913   MSFT
037833100  -571807800  429520564   AAPL
02079K305  -374113909   39113950   GOOGL
023135106  -239339983  2454326870   AMZN

下面是重新创建 Dataframe 的代码:

import pandas as pd
dataset_1 = {'CUSIP': ['594918104', '037833100', '02079K305', '023135106'], '(x$1000)': [
    2765345852, 1891440177, 1721936077, 1341784239], 'PRN AMT': [2114080582, 3058252946, 132543866, 2573051329], 'TICKER': ['MSFT', 'AAPL', 'GOOGL', 'AMZN']}
dataset_2 = {'CUSIP': ['594918104', '037833100', '02079K305', '023135106'], '(x$1000)': [
    3034828140, 2463247977, 2096049986, 1581124222], 'PRN AMT': [1612323669, 2628732382, 93429916, 118724459], 'TICKER': ['MSFT', 'AAPL', 'GOOGL', 'AMZN']}
df_1 = pd.DataFrame(data=dataset_1)
df_2 = pd.DataFrame(data=dataset_2)
print(f'{df_1} and {df_2}')
juzqafwq

juzqafwq1#

CUSIP,TICKER创建MultiIndex,然后减去DataFrame.sub,最后减去DataFrame.reset_index,并按DataFrame.reindex更改列的顺序:

df = (df_1.set_index(['CUSIP','TICKER'])
          .sub(df_2.set_index(['CUSIP','TICKER']))
          .reset_index()
          .reindex(df_1.columns, axis=1))
print (df)

       CUSIP   (x$1000)     PRN AMT TICKER
0  594918104 -269482288   501756913   MSFT
1  037833100 -571807800   429520564   AAPL
2  02079K305 -374113909    39113950  GOOGL
3  023135106 -239339983  2454326870   AMZN

相关问题