首页 > 解决方案 > 按照字典中列出的条件填充新列

问题描述

如果满足条件,我有字典指定行应该采用的值。如果需要,可以对字典进行重组(或者如果您愿意,可以在保留其中信息的同时对其进行重组)

dict_map = {
"Yes" : {'Sex':'F', 'Pregnant': 'Y'},
"No" : {'Sex':'F', 'Pregnant': 'N'},
"N/A" : {'Sex': 'M'},
}

以及数据框和列表

df = pd.DataFrame(
{
    'ID': ['AB01', 'AB02', 'AB03', 'AB04', 'AB05','AB06'],
    'Sex': ["F","M","M",np.nan,"F","F"],
    'Pregnant': ['Y', 'N',np.nan, 'Y', '', 'N']
    
 }
 )

 cols_of_interest = ["Sex","Pregnant"]

如何达到以下结果?

在此处输入图像描述

标签: pythonpandasdataframenumpy

解决方案


将您的查询字符串转换dict_mapSeries可通过query方法使用的查询字符串:

sr = pd.Series({k1: ' & '.join([f"{k2} == '{v}'" for k2, v in d.items()])
                    for k1, d in dict_map.items()})

for v, q in sr.iteritems():
    df.loc[df.query(q).index, 'Status'] = v

输出:

>>> df
     ID  Sex Pregnant Status
0  AB01    F        Y    Yes
1  AB02    M        N    N/A
2  AB03    M      NaN    N/A
3  AB04  NaN        Y    NaN
4  AB05    F             NaN
5  AB06    F        N     No

>>> sr
Yes    Sex == 'F' & Pregnant == 'Y'
No     Sex == 'F' & Pregnant == 'N'
N/A                      Sex == 'M'
Name: Status, dtype: object

更新

我的字典就像 {'Yes': {'Sex': ('F', 'Female')}, 'No': {'Sex': 'M', 'Pregnant': 'N\ A'}} 如何将其转换为上述格式的系列?在英语中,如果性别为 F 或女性,则为 Yes,如果性别为 M 且怀孕为 N\A,则为 No

isin当值是一个元组时使用:

dict_map2 = {'Yes': {'Sex': ('F', 'Female')},
             'No': {'Sex': 'M', 'Pregnant': 'N\A'}}

sr = pd.Series({k1: ' & '.join((f"{k2} == '{v}'" if isinstance(v, str) 
                                    else f"{k2}.isin({v})")
                                    for k2, v in d.items())
                                    for k1, d in dict_map2.items()})
print(sr)

# Output:
Yes         Sex.isin(('F', 'Female'))
No     Sex == 'M' & Pregnant == 'N\A'
dtype: object

循环还是一样的。


推荐阅读