同时迭代多个数据帧行

数据挖掘 Python scikit-学习 数据集 熊猫 预处理
2021-09-23 05:43:02

我有 16 个具有相同行数/列数的不同数据帧和另外 2 个具有相同形状的单独数据帧,我用来与 16 个数据帧值进行比较。

我需要同时遍历所有数据帧,并将所有行值与单独的数据帧进行比较,然后创建另一个数据帧,结果如下:

比较:sum(row_values_of_dataframe) - sum(row_values_of_reference)在下面的示例中,单元格df_a_ref_a等于(1+2+3+4)-(5+5+5+5)=-10

Dataframe A (df_a)

col1 | col 2 | col 3 | col 4
1       2       3       4
2       4       6       8
[...]

Dataframe B (df_b)

col1 | col 2 | col 3 | col 4
10      5       2       1
4       4       6       2
[...]

Reference Dataframe 1 (ref_1)
col1 | col 2 | col 3 | col 4
5       5       5       5
5       5       5       5
[...]

Reference Dataframe 2 (ref_2)
col1 | col 2 | col 3 | col 4
3       3       3       3
3       3       3       3
[...]

最终数据框应为:

df_a_ref_1 | df_a_ref_2 | df_b_ref_1 | df_b_ref_2 | ....
    -10          -2           -2           6        ....
     0           8            -4           4
[...]

这种行为类似于zip()python 中的函数。

提前致谢,

1个回答

首先:我认为您需要产品功能,而不是zip,因为您正在检查 everydf和 every ref在 zip 中,您只需要检查df_a检查ref_1df_bref_2

第二:你可以看看方程(1+2+3+4)-(5+5+5+5)作为(1-5)+(2-5)+...这只是减去数据帧并在列上求和。

考虑到这两个因素,假设您已将对象定义如下:

df_a = {
    'name': 'df_a',
    'value': pd.DataFrame([[1, 2, 3, 4], [2, 4, 6, 8]])
}
df_b = {
    'name': 'df_b',
    'value': pd.DataFrame([[10, 5, 2, 1], [4, 4, 6, 2]])
}

ref_1 = {
    'name': 'ref_1',
    'value': pd.DataFrame([[5, 5, 5, 5], [5, 5, 5, 5]])
}
ref_2 = {
    'name': 'ref_b',
    'value': pd.DataFrame([[3, 3, 3, 3], [3, 3, 3, 3]])
}

我这样做是因为我想使用names 来创建最终 df 的列名。那么您的代码将是:

from itertools import product

final_result = pd.DataFrame(
    {
        '{}_{}'.format(df['name'], ref['name']): (df['value']-ref['value']).sum(axis=1)
        for (df, ref) in product([df_a, df_b], [ref_1, ref_2])
    }
)
  • 我已经使用字典理解来跳过丑陋的循环/追加解决方案。
  • product函数 fromitertools做你的迭代。产品上(ab, cd)给你ac, ad, bc, bd
  • 至于键,df 名称与 连接在一起_,至于值,我减去了两个 df 并在列上求和(axis=1

结果将如您所料:

   df_a_ref_1  df_a_ref_b  df_b_ref_1  df_b_ref_b
0         -10          -2          -2           6
1           0           8          -4           4

尽管如此,如果您想扩展字典理解或不想定义 的字典names/values,当然您可以想象如何for使用相同的逻辑编写简单的循环:

for (df, ref) in product([df_a, df_b], [ref_1, ref_2]):
    # your desired columns
    col = (df - ref).sum(axis=1)