计算两个Pandas DataFrame中列之间的分数差异

时间:2019-12-02 23:04:28

标签: python pandas dataframe

我正在尝试为两个不同的列中具有相同值的行计算两个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)

1 个答案:

答案 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