【问题标题】:mapping information from a dictionary to a data frame when we have null values当我们有空值时,将信息从字典映射到数据框
【发布时间】:2017-10-08 03:32:13
【问题描述】:

这是第一个数据帧

Umls                                    Snomed
C0027497/Nausea /Sign or Symptom    Nausea (finding)[FN/422587007] 
C0151786 / Muscle/Sign or Symptom   Muscle weakness [(finding) /FN/26544005]
C2127305 /bitter/ Sign or Symptom    ?
NA                                   NA

我使用以下代码创建了它的字典

df_dic_1= df_dic_1[['UMLS', 'snomed']]

df_dic_1['UMLS'].fillna(0, inplace=True)
df_dic_1['snomed'].fillna(0, inplace=True)

equiv_snomed=df_dic_1.set_index('UMLS')['snomed'].to_dict()

现在,对于数据框 B:

id     symptom      UMLS                               
1      nausea    C0027497/Nausea /Sign or Symptom
2      muscle     C2127305 /bitter/ Sign or Symptom 
3      headache     
4      pain 
5      bitter     C2127305 /bitter/ Sign or Symptom 

对于字典中可用的“UMLS”列中的任何值,我想创建另一列“Snomed”,其中包含字典中的“snomed”值。所以数据框C应该是这样的:

  id     symptom      UMLS                                   Snomed                         
    1      nausea    C0027497/Nausea /Sign or Symptom    Nausea (finding)[FN/422] 
    2      muscle    C0151786 / Muscle/Sign or Symptom   Muscle [(fi)/FN/25]
    3      headache        
    4      pain 
    5      bitter     C2127305 /bitter/ Sign or Symptom   ?

有什么帮助吗?谢谢

【问题讨论】:

    标签: python pandas dictionary mapping


    【解决方案1】:

    查看 EdChum 对this Stack Overflow question 的回答。

    根据您的情况,它看起来像:

    import pandas as pd
    
    # create dictionary
    d = {'umls1':'snomed1','umls2':'snomed2','umls3':'snomed3'}
    
    # create empty dataframe
    columns = ['symptom','umls','snomed']
    df = pd.DataFrame(columns = columns)
    
    # fill it with symptoms and with umls, with some umls NULL
    df['symptom'] = ['nausea','muscle','headache','pain','bitter']
    df.ix[0,'umls'] = 'umls1'
    df.ix[1,'umls'] = 'umls2'
    df.ix[4,'umls'] = 'umls3'
    
    # add a third column with snomed values from dictionary
    df['snomed'] = df['umls'].map(d)
    

    给出以下输出:

    df.head()
    Out[21]: 
        symptom   umls   snomed
    0    nausea  umls1  snomed1
    1    muscle  umls2  snomed2
    2  headache    NaN      NaN
    3      pain    NaN      NaN
    4    bitter  umls3  snomed3
    

    【讨论】:

      【解决方案2】:

      您可以对列 UMLS 的每个元素使用 apply 函数,并从字典 equiv_snomed 中获取值。如果字典中没有键,则可以返回 np.nan

      如果您的数据框 B 被命名为 df2.那么

      df2['Snomed'] = df2['UMLS'].apply(lambda x: equiv_snomed.get(x, np.nan))
      

      【讨论】:

      • 您能解释一下为什么使用“np.nam”吗?
      • 如果字典中没有键(例如 UMLS 列中的条目在 equiv_snomed 中没有映射),则 'get' 方法将引发 keyerror。为了避免这种情况,你可以传递一个默认的 np.nan 来应用函数。
      猜你喜欢
      • 1970-01-01
      • 2018-08-13
      • 2015-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-25
      • 2021-01-01
      • 2021-10-26
      相关资源
      最近更新 更多