[英]How to substact each other in a dictionary of dataframes in Python
我有一个数据框字典,看起来像 {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
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.