【问题标题】:CSV Columns comparison using Python Pandas使用 Python Pandas 比较 CSV 列
【发布时间】:2017-12-20 07:15:19
【问题描述】:

我有一个熊猫数据框 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】:

    您可以与eq 进行比较,但如果不需要匹配,请添加带有assign 的新列,用于NaNs。然后用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  
    

    【讨论】:

    • 列名可能有错别字,返回 print (df.columns.tolist()) 是什么?
    • sat3 里面有空格,最后。所以先试试df.columns = df.columns.str.strip()
    • 我添加它来回答。
    • 超级!而不是减去即 val1-val3 我想减去它的原始值。
    • @谢谢。我明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-08
    • 1970-01-01
    • 2015-02-13
    • 2019-04-18
    相关资源
    最近更新 更多