python - 按照字典中列出的条件填充新列
问题描述
如果满足条件,我有字典指定行应该采用的值。如果需要,可以对字典进行重组(或者如果您愿意,可以在保留其中信息的同时对其进行重组)
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"]
如何达到以下结果?
解决方案
将您的查询字符串转换dict_map
为Series
可通过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
循环还是一样的。
推荐阅读
- r - 为 R 包中示例中使用的数据集生成文档
- python - 警告:“pysqlite3”的旧版轮子没有创建文件。- 我如何构建一个非传统版本的轮子?
- android - setOnClickListener 不适用于 Kotlin 中的图像滑块
- rust - 如何使用 Rocket Web 框架代理/转发数据?
- laravel - 为本地 laravel REST API 使用 http://192.168 地址
- android - 强制 Android Studio 始终为 Gradle 使用自己的 JRE
- javascript - javascript中未知的导入路径格式
- javascript - 在内部执行 XSS当 >< 被过滤并且无法使用 '" 进行转义时
- django - django social 登录后不返回用户
- php - JSON在PHP中解析数字数据