【问题标题】:Pandas dataframe compare columns of different sizes in different dataframesPandas 数据框比较不同数据框中不同大小的列
【发布时间】:2021-12-14 01:10:44
【问题描述】:

我正在尝试比较两个数据框:

df1:

       entry  mass  Precursor  mass_pos
0     KGTLPK   128    642.780   770.780
1     KGTLPK    48    642.780   690.780
2     KGTLPK   112    642.780   754.780
3     KGTLPK    32    642.780   674.780
4     KGTLPK   156    642.780   798.780

df2:

      Mass
0  586.672
1  798.780
2  690.780
3  400.000

我的目标是找到 df2 'mass' 与 df1 'mass_pos' 的任何匹配项。

我真的很喜欢这个:

df1['masses match'] = np.where(df2['Mass'] == df1['mass_pos'], 'True', 'False')

但这会引发值错误:

ValueError: Can only compare identically-labeled Series objects

我认为这是因为这些数据帧的行数不同。有没有办法克服这个问题?

【问题讨论】:

  • 可能是df1['mass_pos'].isin(df2['Mass'])。也就是说,不建议在 float 上完全匹配。

标签: python pandas dataframe


【解决方案1】:

使用np.isclose:

tolerance = 1e-03
match_mass = lambda x: np.any(np.isclose(x, df2['Mass'], atol=tolerance))
df1['masses match'] = df1['mass_pos'].apply(match_mass)
print(df1)

# Output:
    entry  mass  Precursor  mass_pos  masses match
0  KGTLPK   128     642.78    770.78         False
1  KGTLPK    48     642.78    690.78          True
2  KGTLPK   112     642.78    754.78         False
3  KGTLPK    32     642.78    674.78         False
4  KGTLPK   156     642.78    798.78          True

【讨论】:

    【解决方案2】:

    使用merge 来检查存在的项目。

    示例:

    df=df1.merge(df2,left_on="mass_pos",right_on="Mass")
    

    代码:

    import pandas as pd
    
    df1 = pd.DataFrame({'entry': ['KGTLPK','KGTLPK','KGTLPK','KGTLPK','KGTLPK' ],
                        'mass': [128 ,48, 112 , 32, 156],
                        'Precursor': [642.780,642.780,642.780,642.780,642.780],
                        'mass_pos': [ 770.780, 690.780, 754.780, 674.780, 798.780]
                        })
    
    df2 = pd.DataFrame({'Mass': [586.672, 798.780, 690.780, 400.000 ]})
    
    df=df1.merge(df2,left_on="mass_pos",right_on="Mass")
    
    print(df)
    

    输出:

        entry  mass  Precursor  mass_pos    Mass
    0  KGTLPK    48     642.78    690.78  690.78
    1  KGTLPK   156     642.78    798.78  798.78
    

    为了得到预期的结果,我这样做了:

    import pandas as pd
    
    df1 = pd.DataFrame({'entry': ['KGTLPK','KGTLPK','KGTLPK','KGTLPK','KGTLPK' ],
                        'mass': [128 ,48, 112 , 32, 156],
                        'Precursor': [642.780,642.780,642.780,642.780,642.780],
                        'mass_pos': [ 770.780, 690.780, 754.780, 674.780, 798.780]
                        })
    
    df2 = pd.DataFrame({'Mass': [586.672, 798.780, 690.780, 400.000 ]})
    
    DF3 = df1[['mass_pos']].fillna('None')
    DF4 = df2[['Mass']].fillna('None')
    df1['Merge_Result'] = 'F'
    for i in range(DF3.shape[0]):
        for k in range(DF4.shape[0]):        
            if list(DF3.iloc[i]) == list(DF4.iloc[k]):
                df1['Merge_Result'][i] = 'T'
                
    print(df1)
    

    输出:

        entry  mass  Precursor  mass_pos Merge_Result
    0  KGTLPK   128     642.78    770.78            F
    1  KGTLPK    48     642.78    690.78            T
    2  KGTLPK   112     642.78    754.78            F
    3  KGTLPK    32     642.78    674.78            F
    4  KGTLPK   156     642.78    798.78            T
    

    【讨论】:

      猜你喜欢
      • 2018-10-10
      • 2015-02-17
      • 1970-01-01
      • 2018-01-25
      • 1970-01-01
      • 2017-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多