【问题标题】:Python - compare values in a dataframe and if they are the same append the rows to a new dataframePython - 比较数据框中的值,如果它们相同,则将行附加到新的数据框中
【发布时间】:2021-02-24 09:57:03
【问题描述】:

我使用 pandas iloc 和 .append() 尝试了几件事 但我的代码根本不起作用:(

我想要什么: 我想在一行中查找“dt”和“RT”的值 然后我想遍历数据帧的其余部分以检查是否满足以下条件: “dt”的值应在 +-0.1 到比较的“dt”值的范围内 和 “RT”也应该在 +-0.1 到比较的“RT”值的范围内

如果两个条件都满足: 将满足这些条件的这 2 行(所有行)复制到新的数据框

df1 = pd.DataFrame([[1, 760, 36.00, 14.1 , 15000], [2, 184, 36.05, 14.12, 11000], [3, 104, 36.95, 14.13, 12000], [4, 120, 34, 13, 16000]], columns=list(["ID","mz","dt","RT", "area"]))


a = [0,1,2,3]

for i in a:
    df2 = df2.append((df1.loc[(df1.loc[i, ["dt"]]) - 0.1) <= df1.loc[(df1.loc[i, ["dt"]]) <= (df1.loc[(df1.loc[i, ["dt"]]) + 0.1)) & (df1.loc[i, ["RT"]])])

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我认为你用那条充满条件的链条使事情变得过于复杂。您可以在单个“.loc”中组合多个条件,只需在它们之间添加“&”即可。

    这里我将向您展示如何在您自己的示例中应用它:

    import pandas as pd
    
    df1 = pd.DataFrame([[1, 760, 36.00, 14.1 , 15000], [2, 184, 36.05, 14.12, 11000], [3, 104, 36.95, 14.13, 12000], [4, 120, 34, 13, 16000]], columns=list(["ID","mz","dt","RT", "area"]))
    
    df_list = []
                       
    a = [0,1,2,3]
    
    for i in a: 
        
        df_i = pd.DataFrame(data=None,columns=list(["ID","mz","dt","RT", "area"]))
        current_row_dt = df1.loc[i]['dt']
        current_row_RT = df1.loc[i]['RT']
        
        # Multiple conditions
        # ===================
    
        df_i = df1.loc[(df1['dt'] <= current_row_dt + 0.1) & (df1['dt'] <= current_row_dt + 0.1) & (df1['RT'] <= current_row_RT + 0.1) & (df1['RT'] <= current_row_RT + 0.1)]
        df_list.append(df_i)
        
    

    您必须充分考虑括号,因为 python 为“&”分配了比

    如果您有任何问题,请随时提出。

    PD:请注意,在我的示例中,每次循环迭代获得的行都保存在数据帧数组中,而不是单个数据帧中。我这样做是为了让您可以更好地看到每次迭代中添加的内容,但您可能想要更改它。

    【讨论】:

      【解决方案2】:

      非常感谢您的帮助 :) 它可以满足我的要求,但现在我尝试对其进行一些改进,顺便说一下,如果在数据框中找不到任何条目,则符合标准,则应删除初始行。

      所以我的想法是,我希望我的数据被“压缩/清理”。

      所以最终结果应该只包含数据,其中至少有 2 行或更多行在 RT 和 DT 方面相互匹配。

      如果 a 行在 RT 和 DT 方面是“唯一的”,则它不应出现在最终结果中。

      df1 = pd.DataFrame([[1, 760, 36.00, 14.1, 15000, 22], [3, 104, 35.95, 14.13, 12000, 22], [4, 120, 34, 13, 16000, 22 ], [2, 184, 36.05, 14.12, 11000, 22],[8, 8, 8, 8, 8, 22],[7, 7, 7, 7, 7, 22],[6, 6, 6 , 6, 6, 22]], columns=list(["ID","mz","DT","RT", "area", "random"]))

      结果 = ([1, 760, 36.00, 14.1 , 15000], [2, 184, 36.05, 14.12, 11000], [3, 104, 36.95, 14.13, 12000])

      下面的代码或多或少可以完成这项工作,但需要大量时间,因为两个 for 循环...

      import pandas as pd
      
      df1 =  pd.read_csv("test7.csv")
      #df1 = pd.DataFrame([[1, 760, 36.00, 14.1 , 15000, 22], [3, 104, 35.95, 14.13, 12000, 22], [4, 120, 34, 13, 16000, 22], [2, 184, 36.05, 14.12, 11000, 22],[8, 8, 8, 8, 8, 22],[7, 7, 7, 7, 7, 22],[6, 6, 6, 6, 6, 22]], columns=list(["ID","mz","DT","RT", "area", "random"]))
      df_list = pd.DataFrame()
      final = pd.DataFrame()
      
      a = len(df1)
      
      df2 = df1
      
      for i in range(a): 
          current_row_dt = df2.loc[i]['DT']
          current_row_RT = df2.loc[i]['RT']
         
      
          for b in range(a): 
              compared_row_dt = df2.loc[b]['DT']
              compared_row_RT = df2.loc[b]['RT']
          
               if compared_row_dt <= (current_row_dt + 0.1) and compared_row_dt >= (current_row_dt - 0.1): 
                  if compared_row_RT <= (current_row_RT + 0.1) and compared_row_RT >= (current_row_RT - 0.1):
                      df_i = df2.loc[b]
                      df_list = df_list.append(df_i)
      
      df_dup = df_list[df_list.duplicated(keep=False)]
      df_final = df_dup.drop_duplicates()
      print(df_final)
      df_final.to_csv("test7_sorted.csv") 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-12-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        相关资源
        最近更新 更多