【问题标题】:Get the count of matching and not matching columns data in a dataframe获取数据框中匹配和不匹配列数据的计数
【发布时间】:2019-10-17 06:42:59
【问题描述】:

我有两个类似的数据框, 这是输入的 csv 数据。

Document_ID OFFSET  PredictedFeature
    0         0            2000
    0         8            2000
    0         16           2200
    0         23           2200
    0         30           2200
    1          0            2100
    1          5            2100
    1          7            2100

现在我也有了输出数据

 Document_ID    OFFSET   PredictedFeature
        0         0            2000
        0         8            2100
        0         16           2100
        0         23           2100
        0         30           2200
        1          0           2000
        1          5           2000
        1          7           2100

现在,我在这里要做的是匹配他们得到或没有得到的结果。

原来如此,

df1_inputPredictedFeature_column['new'] = df1_inputPredictedFeature_column['PredictedFeature'] == df1_predictedFeature_column['PredictedFeature']

这会添加一列来告诉天气它是否与预测特征列匹配。

现在我正在尝试的是,

共有 2 个特征,其中 2000 在输入 csv 的预测特征中。但在输出的 csv 中,只有第一名是匹配的,而不是第二名。

所以我正在尝试获取这些数据,例如,

predictedFeatureClass  inputCsvOccured   outputcsvmatched  

 2000                        2                1

2200                         3                 1

那么,我将如何获得这些数据?任何帮助都会很棒。

【问题讨论】:

    标签: python python-3.x pandas numpy


    【解决方案1】:

    一个想法是通过Series.viewnew 列转换为整数,然后通过元组列表将newsizesum 聚合以指定新列名称:

    df1['new'] = (df1['PredictedFeature'] == df2['PredictedFeature']).view('i1')
    
    df = (df1.groupby("PredictedFeature")['new']
             .agg([('inputCsvOccured','size'), ('outputcsvmatched','sum')])
             .reset_index())
    print (df)
       PredictedFeature  inputCsvOccured  outputcsvmatched
    0              2000                2                 1
    1              2100                3                 1
    2              2200                3                 1
    

    Pandas 0.25+ 解决方案:

    df1['new'] = (df1['PredictedFeature'] == df2['PredictedFeature']).view('i1')
    
    df = (df1.groupby("PredictedFeature")
             .agg(inputCsvOccured=pd.NamedAgg(column='new', aggfunc='size'),
                  outputcsvmatched=pd.NamedAgg(column='new', aggfunc='sum'))
             .reset_index())
    

    【讨论】:

      【解决方案2】:

      你可以使用下面的 groupby 来做到这一点

      df1_inputPredictedFeature_column = pd.DataFrame([['0', '0', '2000'], ['0', '8', '2000'], ['0', '16', '2200'], ['0', '23', '2200'], ['0', '30', '2200'], ['1', '0', '2100'], ['1', '5', '2100'], ['1', '7', '2100']], columns=('Document_ID', 'OFFSET', 'PredictedFeature'))
      df1_predictedFeature_column = pd.DataFrame([['0', '0', '2000'], ['0', '8', '2100'], ['0', '16', '2100'], ['0', '23', '2100'], ['0', '30', '2200'], ['1', '0', '2000'], ['1', '5', '2000'], ['1', '7', '2100']], columns=('Document_ID', 'OFFSET', 'PredictedFeature'))
      
      df1_inputPredictedFeature_column['new'] = (df1_inputPredictedFeature_column['PredictedFeature'] == df1_predictedFeature_column['PredictedFeature']).astype(np.int)
      
      result = df1_inputPredictedFeature_column.groupby("PredictedFeature").agg({"PredictedFeature":"count", "new":np.sum})
      
      result.columns = ["inputCsvOccured", "outputcsvmatched"]
      result.index.name = "predictedFeatureClass"
      
      result.reset_index(inplace=True)
      print(result)
      

      结果

      predictedFeatureClass  inputCsvOccured  outputcsvmatched
      0                  2000                2                 1
      1                  2100                3                 1
      2                  2200                3                 1
      

      【讨论】:

      • 我认为它给出了准确的输出,我认为它采用了相同的数据帧
      • 请不要通过我的回答改变解决方案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-01
      • 1970-01-01
      • 2021-02-20
      • 2012-09-14
      • 2021-03-07
      • 1970-01-01
      相关资源
      最近更新 更多