我有一个熊猫数据框df1
Time sat1 sat2 sat3 sat4 val1 val2 val3 val4
10 2 4 2 4 0.1 -1.0 1 2.0
20 3 1 1 3 1.6 0 2.1 -0.7
30 12 8 8 16 0.5 1.1 0.6 2.0
40 2 1 2 12 1.0 1.2 0.4 3.7
我想随时比较 sat1,sat2 与 sat3 和 sat4。 如果这两列之间有匹配,我想得到匹配的数量 元素并减去匹配的元素值列。
预期输出:
match_count Reslt_1 Reslt_2
2 val1-val3 val2-val4
2 val1-val4 val2-val3
1 Nan val2-val3
1 val1-val3 Nan ( w.r.t match found in sat1 or sat2)
这些数据是示例数据,列数可能会增加。sat1,sat2中的数据在sat3和sat4中切换,这就是为什么减法会发生相应的原因。
如何使用熊猫获得高于预期的输出。我获得了上面的数据帧 使用熊猫连接功能。
您可以与eq
进行比较,但如果需要匹配,请添加带有assign
的新列,用于NaN
秒。然后得到带有argmax
列的位置,提取val
列中的值并减去:
#remove trailing whitespaces in columns names
df.columns = df.columns.str.strip()
a = df[['sat3','sat4']].eq(df['sat1'], axis=0).assign(no = True)
a1 = a.values.argmax(axis=1)
df['Reslt_1'] = df['val1'] - df[['val3','val4']].assign(no = np.nan).values[df.index, a1]
b = df[['sat3','sat4']].eq(df['sat2'], axis=0).assign(no = True)
b1 = b.values.argmax(axis=1)
df['Reslt_2'] = df['val2'] - df[['val3','val4']].assign(no = np.nan).values[df.index, b1]
df['match_count'] = a.sum(1) - 1 + b.sum(1) - 1
print (df)
Time sat1 sat2 sat3 sat4 val1 val2 val3 val4 Reslt_1 Reslt_2
0 10 2 4 2 4 0.1 -1.0 1.0 2.0 -0.9 -3.0
1 20 3 1 1 3 1.6 0.0 2.1 -0.7 2.3 -2.1
2 30 12 8 8 16 0.5 1.1 0.6 2.0 NaN 0.5
3 40 2 1 2 12 1.0 1.2 0.4 3.7 0.6 NaN
match_count
0 2
1 2
2 1
3 1