【问题标题】:Populating a column based off of values in another column根据另一列中的值填充一列
【发布时间】:2020-07-31 14:29:08
【问题描述】:

您好,我正在与pandas 合作处理一些实验室数据。我目前有一个data frame,有 5 列。

  • 前三列(分析物、CAS NO(1) 和值)的顺序正确。
  • 最后两列(CAS NO 2 和 Value 2)不是。

有没有办法根据匹配的 CAS 编号(又名 CAS NO(2)=CAS(NO1))将 CAS No(2) 和 Value(2) 与前三列对齐。

我是pythonpandas 的新手。谢谢你的帮助

【问题讨论】:

    标签: python pandas dataframe series data-processing


    【解决方案1】:

    您可以通过将 df 变量重新分配为自身的切片来重新排序列,该切片在其条目是相关列名的列表中被索引。

    colidx = ['Analyte', 'CAS NO(1)', 'CAS NO(2)']
    df = df[colidx]
    

    【讨论】:

      【解决方案2】:

      最好以文本格式提供输入数据,以便我们可以复制粘贴。我理解您这样的问题:您需要将最后两列排序在一起,以便 CAS NO(2) 与 CAS NO(1) 匹配。

      既然CAS NO(2)=CAS(NO1) 你就不需要重复CAS NO(2) 列了吧?

      拆分最后两列并从中创建一个系列,然后将该系列转换为 dict,并使用该 dict 映射新值。

      # Split 2 last columns and assign index.
      df_tmp = df[['CAS NO(2)', 'Value(2)']]
      df_tmp = df_tmp.set_index('CAS NO(2)')
      
      # Keep only 3 first columns of original dataframe
      df = df[['Analyte',' CASNo(1)', 'Value(1)']]
      
      # Now copy the CasNO(1) to CAS NO(2)
      df['CAS NO(2)'] = df['CasNO(1)']
      
      # Now create Value(2) column on original dataframe
      df['Value(2)'] = df['CASNo(1)'].map(df_tmp.to_dict()['Value(2)'])
      

      【讨论】:

      • 进入第 3 步时出现以下错误: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.Try using .loc[row_indexer,col_indexer] = value请参阅文档中的警告:pandas.pydata.org/pandas-docs/stable/user_guide/… """启动 IPython 内核的入口点。
      【解决方案3】:

      尝试以下方法:

      import pandas as pd
      import numpy as np
      
      #create an example of your table
      list_CASNo1 = ['71-43-2', '100-41-4', np.nan, '1634-04-4']
      list_Val1 = [np.nan]*len(list_CASNo1)
      list_CASNo2 = [np.nan, np.nan, np.nan, '100-41-4']
      list_Val2 = [np.nan, np.nan, np.nan, '18']
      
      df = pd.DataFrame(zip(list_CASNo1, list_Val1, list_CASNo2, list_Val2), columns =['CASNo(1)','Value(1)','CAS NO(2)','Value(2)'], index = ['Benzene','Ethylbenzene','Gasonline Range Organics','Methyl-tert-butyl ether'])
      
      #split the data to two dataframes
      df1 = df[['CASNo(1)','Value(1)']]
      df2 = df[['CAS NO(2)','Value(2)']]
      
      #merge df2 to df1 based on the specified columns
      #reset_index and set_index will take care
      #that df_adjusted will have the same index names as df1
      df_adjusted = df1.reset_index().merge(df2.dropna(),
                                            how = 'left',
                                            left_on = 'CASNo(1)',
                                            right_on = 'CAS NO(2)').set_index('index')
      
      

      但要小心列中的重复项,这将导致合并失败..

      【讨论】:

        猜你喜欢
        • 2021-03-16
        • 1970-01-01
        • 2020-02-17
        • 2021-01-24
        • 1970-01-01
        • 2020-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多