我正在尝试为两个不同的列中具有相同值的行计算两个DataFrame中的> 20列之间的分数差异。
例如给出两个数据框:
df1 = index, A, B, C, D, ID
0, 2, 1, 5, 4, -2
1, 1, 2, 2, 4, -1
2, 2, 4, 8, 8, 0
3, 1, 4, 6, 5, 1
df2 = index, A, B, C, D, ID
0, 2, 1, 2, 2, -3
1, 4, 3, 3, 2, -2
2, 6, 2, 4, 6, -1
3, 1, 4, 2, 4, 0
对于每一列(A-D),如果该行具有相同的ID值,我想获得小数差异(即df3['A'] = (df1['A']-df2['A'])/df1['A']
)。任一数据框中可能存在没有通用ID的行,因此这些行不应包含在df3中。
所需的输出:
df3 = index, A, B, C, D, ID
0, -1, -2, 0.4, 0.5, -2
1, -5, 0, -1, -0.5, -1
2, 0.5, 0, 0.75, 0.5, 0
最终我也想获得df3中A-D列每一行的这些分数差异的平方和(即所示示例为32.72)
答案 0 :(得分:3)
您将要在两个数据帧上将ID
设置为索引,然后可以直接取不同数据帧的索引。下面的代码将满足您的需求:
样本数据
df1 = pd.DataFrame(
[[0, 2, 1, 5, 4, -2],
[1, 1, 2, 2, 4, -1],
[2, 2, 4, 8, 8, 0 ],
[3, 1, 4, 6, 5, 1]], columns = ['index', 'A', 'B', 'C', 'D', 'ID'])
df2 = pd.DataFrame(
[[0, 2, 1, 2, 2, -3],
[1, 4, 3, 3, 2, -2],
[2, 6, 2, 4, 6, -1 ],
[3, 1, 4, 2, 4, 0]], columns = ['index', 'A', 'B', 'C', 'D', 'ID'])
分数差
df1 = df1.set_index('ID') # set index for fractional differencing
df2 = df2.set_index('ID') # set index for fractional differencing
target_cols = ['A', 'B', 'C', 'D'] # define columns to use in differencing
df3 = (df1[target_cols] - df2[target_cols]) / df1[target_cols] # get fractional difference
df3 = df3.dropna().reset_index() # remove row observations without intersecting IDs in df1 and df2
输出
print(df3.to_string())
ID A B C D
0 -2 -1.00 -2.00 0.40 0.50
1 -1 -5.00 0.00 -1.00 -0.50
2 0 0.50 0.00 0.75 0.50