我有一個數據框字典,看起來像 {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 |
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] 删除。
我来说两句