繁体   English   中英

根据另一列和字典值填充熊猫的 dataframe 列

[英]Populate a panda's dataframe column based on another column and dictionary value

我有一个数据框,其中包含一个名为 DIAGNOSES 的列。 此 DIAGNOSES 列包含 1 个或多个字符串的列表,以字符开头。

我想检查 DIAGNOSES 中每一行的第一个字符并获取它的第一个字符以从字典中查找它以使用这些值填充 DIAGNOSES_TYPE 列。

最小的例子:

diagnoses = {'A': 'Arbitrary', 'B': 'Brutal', 'C': 'Cluster', 'D': 'Dropped'}

df = pd.DataFrame({'DIAGNOSES': [['A03'], ['A03', 'B23'], ['A30', 'B54', 'D65', 'C60']]})
              DIAGNOSES
0                 [A03]
1            [A03, B23]
2  [A30, B54, D65, C60]

一点可视化来澄清我想要得到的东西,我想要填充 df['DIAGNOSES_TYPES'] :

诊断具有所需列的数据框

我是这样处理的:

def map_diagnose(df)
    for col in len(range(df)):
        for d in df['DIAGNOSIS']:
            for diag in d:
                if diag[0] in diagnoses_dict.keys():
                    df['DIAGNOSES_TYPES'] = diagnoses_dict.get(diag[0])
                df['DIAGNOSES_TYPES'] = ''
    return df

使用explodemapgroupby

diagnoses = {'A': 'Arbitrary', 'B': 'Brutal', 'C': 'Cluster', 'D': 'Dropped'}
df1 = df.explode('DIAGNOSES')
df1['SD'] = df1['DIAGNOSES'].str.extract('(\D)')
df1['DIAGNOSES_TYPES'] = df1['SD'].map(diagnoses)
df1.groupby(level=0).agg(list)

output:

    DIAGNOSES                SD             DIAGNOSES_TYPES
0   [A03]                    [A]            [Arbitrary]
1   [A03, B23]               [A, B]         [Arbitrary, Brutal]
2   [A30, B54, D65, C60]     [A, B, D, C]   [Arbitrary, Brutal, Dropped, Cluster]

列'SD'是每个用于映射的dagnoses的第一个字母; 如果不需要,您可以drop此列

您可以展开“诊断”列,使用str获取每个字符串的第一个元素, explode diagnoses字典以获取类型,按索引groupby并聚合到列表:

df['DIAGNOSES_TYPE'] = df['DIAGNOSES'].explode().str[0].map(diagnoses).groupby(level=0).apply(list)

Output:

              DIAGNOSES                         DIAGNOSES_TYPE
0                 [A03]                            [Arbitrary]
1            [A03, B23]                    [Arbitrary, Brutal]
2  [A30, B54, D65, C60]  [Arbitrary, Brutal, Dropped, Cluster]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM