我有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()
函数。
预先感谢
答案 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)