同时遍历多个数据框行

时间:2020-03-27 16:59:13

标签: python pandas dataframe

我有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
[...]

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

预先感谢

3 个答案:

答案 0 :(得分:1)

Yo可以将数据框存储在两个不同的列表中,然后遍历它们,同时为每个数据框附加一个新列。

这是一个具有2个数据帧的示例(您只需添加其他14个)。

list_dataframes = [df, df2]
list_dataframes_references = [df_reference, df_reference2]
list_names = ["a", "b"]

final_df = pd.DataFrame()

for i in range(len(list_dataframes)):
    a_sum = list_dataframes[i].sum(axis=1)
    a_ref_sum = list_dataframes_references[i].sum(axis=1)

    final_df.loc[:, "columna_{}".format(list_names[i])] = a_sum - a_ref_sum

在这里,您避免使用矢量化(如用户@bug_spray所说的那样)在数据帧中进行迭代,这样效率更高且更干净。

答案 1 :(得分:0)

我不了解您为数据框指定的确切名称,但是您可以通过以下方式实现这一目标:

new_df = pd.DataFrame()
for df, ref in #loop over dfs and refs:
    new_df[#column name] = df.to_numpy().sum(1) - ref.to_numpy().sum(1)

如果您喜欢dfs和refs的列表,则可以进行for df, ref in zip(dfs, refs)

答案 2 :(得分:0)

使用矢量化。

A = pd.DataFrame([[1,2,3,4],[2,4,6,8]])
B = pd.DataFrame([[10,5,2,1],[4,4,6,2]])
# ...

dfs = [A, B, ...]

ref_a1 = (A - 5).sum(1)
ref_a2 = (A - 3).sum(1)
ref_b1 = (B - 5).sum(1)
ref_b2 = (B - 3).sum(1)

如果需要,可以将其循环放置...

dfs = [A,B,...]
result_names = ['df_a_ref_1', 'df_a_ref_2', 'df_b_ref_1', ...]

res = []
for df in dfs:
    res += [(df-5).sum(1)]
    res += [(df-3).sum(1)]

results = pd.DataFrame(res, columns=result_names)