【问题标题】:Iterate over multiple dataframe rows at the same time同时迭代多个数据帧行
【发布时间】:2020-03-28 01:23:12
【问题描述】:

我有 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() 函数。

提前致谢,

【问题讨论】:

  • 你熟悉矢量化吗?比迭代快很多,看起来很适合这类问题

标签: python pandas dataframe


【解决方案1】:

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

这是一个包含 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 所说)在数据帧内进行迭代,这样更高效、更干净。

【讨论】:

    【解决方案2】:

    我不明白您为数据框提供的确切名称,但您可以通过以下方式实现:

    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)

    【讨论】:

    • 另外,如果你想比较所有 dfs 和所有 refs,你只需要做 2 个 for 循环。
    • 我必须同时运行所有 dfs(一次一行),因为我将创建一个新数据框并将每个计算(row-df 减去 row-ref)分配给一个新单元格。
    • 没有得到同时部分,你想并行计算吗?
    【解决方案3】:

    使用矢量化。

    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)
    
    

    【讨论】:

      猜你喜欢
      • 2022-01-15
      • 2020-11-22
      • 2018-07-10
      • 2017-06-18
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多