繁体   English   中英

如何在 Python 中的数据框字典中相互减去

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM