我有一个pandas数据框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,这就是减法将相应发生的原因。
如何使用pandas获得高于预期的输出。我获得了上面的数据帧 使用pandas concat函数。
答案 0 :(得分:2)
您可以与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