使用Python Pandas进行CSV列比较

问题描述 投票:2回答:1

我有一个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函数获得了上面的数据帧。

python-2.7 pandas dataframe compare multiple-columns
1个回答
2
投票

您可以与eq进行比较,但如果不需要匹配,请为assigns添加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  
© www.soinside.com 2019 - 2024. All rights reserved.