如何在 Python 中的數據框字典中相互減去

YUE LYU

我有一個數據框字典,看起來像 {test1:df1, test2:df2, test3:df3,...}。

在每個數據框中,我都有一個名為“成功率”的列。

如果我打印出來,它看起來像這樣:

'測試 1'

象徵 成功率
0001.A 0.4
0002.B 0.5
0003.C 0.78

'測試 2'

象徵 成功率
0002.A 0.66
0002.G 0.88
0005.C 0.99

'測試 3'

象徵 成功率
0034.EF 0.3
0001.A 0.9
0005.C 0.7

我們不知道字典中有多少個數據框(數據框的數量是動態的)。

在每個數據框中,行數可能不同(有些有 20,000 行,有些可能有 20,007 行),但它們必須有很多相同的符號。

現在我想創建新的數據幀,比較不同測試之間成功率的差異,理想的結果可能如下所示:

'測試 1 & 測試 2'

象徵 成功率差異
0001.A 0.1
0002.B 0.2
0003.C 0.03

'測試 2 & 測試 3'

象徵 成功率差
0002.A 0.09
0002.G 0.22
0005.C 0.13

'測試 3 & 測試 1'

象徵 成功率差
0034.EF 0.04
0001.A 0.04
0005.C 0.03
Gaz Zhao
import pandas as pd
import itertools

# mimic the input data
test1 = pd.DataFrame({'Symbol': ['A', 'B', 'C'], 'Rate': [0.1, 0.2, 0.3]})
test2 = pd.DataFrame({'Symbol': ['B', 'C', 'D'], 'Rate': [0.4, 0.6, 0.8]})
test3 = pd.DataFrame({'Symbol': ['C', 'D', 'E'], 'Rate': [0.5, 0.6, 0.8]})
df_collection = {'test1': test1, 'test2': test2, 'test3': test3}

# shuffle two elements from a list, put into a generator
coms = itertools.combinations(df_collection.keys(), 2)

results = {}

# iterate the generator, do the comparison, and store the output in results.
for x, y in coms:
    df_x = df_collection[x]  
    df_y = df_collection[y]
    df_merge = df_x.merge(df_y, on='Symbol', how='inner' ,indicator=False)
    df_merge['Diff'] = df_merge.apply(lambda row: row[f'Rate_x'] - row['Rate_y'], axis=1)
    df_merge.drop(['Rate_x', 'Rate_y'], axis=1, inplace=True)
    results[f'{x}-{y}'] = df_merge

for k, v in results.items():
    print(k)
    print(v)

輸出

test1-test2
  Symbol  Diff
0      B  -0.2
1      C  -0.3
test1-test3
  Symbol  Diff
0      C  -0.2
test2-test3
  Symbol  Diff
0      C   0.1
1      D   0.2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章