python-3.x - 根据来自其他列的连接值定义列
问题描述
我有一个如下给出的数据框;
temp2= pd.DataFrame({'id':[0,1,2,3],'participant_type_dic':[{'0': 'Victim', '1': 'Victim'},\
{'0': 'Victim','1': 'Suspect'},\
{'0': 'Victim'},\
{'0': 'Victim', '1': 'Victim'}],\
'gun_stolen':['yes','no','yes','yes'],
'participant_age_category':[{'0': 'Adult', '1': 'Adult'},\
{'0': 'Adult','1': 'Teen'},\
{'0': 'Adult'},\
{'0': 'Adult', '1': 'Teen'}]})
id | participant_type_dic | gun_stolen | participant_age_category
| | |
0 | {'0':'Victim','1':'Victim'} | yes | {'0':'Adult','1':'Adult'}
| | |
1 | {'0':'Victim','1':'Suspect'} | no | {'0':'Adult','1':'Teen'}
| | |
2 | {'0':'Victim'} | yes | {'0': 'Adult'}
| | |
| | |
3 | {'0': 'Victim', '1': 'Victim'} | yes | {'0': 'Adult', '1': 'Teen'}
为简单起见,此数据框有 4 列。在这里,有两列特别令人感兴趣;participant_type_dic
, 和participant_age_category
. 列中的条目participant_type_dic
是以下形式的字典;{'0': 'Victim', '1': 'Victim'}
,这意味着对于 0 的键值,该人是受害者。同样,在 列participant_age_category
中,键值 0 实际上是成人,请参见{'0': 'Adult', '1': 'Adult'}
。
因此,在第一排,有 2 名受害者,而且这些受害者都是成年人。同样在第二排,有一名成年受害者,还有一名青少年嫌疑人。目标是计算成年受害者的人数。因此,我们需要以下输出;
期望的输出
id | participant_type_dic | gun_stolen | participant_age_category | adult_victim
-------------------------------------------------------------------------------------------------
| | | |
0 | {'0':'Victim','1':'Victim'} | yes | {'0':'Adult','1':'Adult'} | 2
| | | |
1 | {'0':'Victim','1':'Suspect'} | no | {'0':'Adult','1':'Teen'} | 1
| | | |
2 | {'0':'Victim'} | yes | {'0': 'Adult'} | 1
| | | |
| | | |
3 | {'0': 'Victim', '1': 'Victim'} | yes | {'0': 'Adult', '1': 'Teen'}| 1
我能够想出以下想法来计算adult_victims;
from collections import defaultdict
d=defaultdict(int)
for k in temp2.iterrows():
for j in k[1][1].keys():
str1=k[1][1][j]
str2=k[1][3][j]
s=str1+'-'+str2
d[s]+=1
print(d)
这给出了以下输出;
defaultdict(<class 'int'>, {'Victim-Adult': 1})
defaultdict(<class 'int'>, {'Victim-Adult': 2})
defaultdict(<class 'int'>, {'Victim-Adult': 3})
defaultdict(<class 'int'>, {'Victim-Adult': 3, 'Suspect-Teen': 1})
defaultdict(<class 'int'>, {'Victim-Adult': 4, 'Suspect-Teen': 1})
defaultdict(<class 'int'>, {'Victim-Adult': 5, 'Suspect-Teen': 1})
defaultdict(<class 'int'>, {'Victim-Adult': 5, 'Suspect-Teen': 1, 'Victim-Teen': 1})
但这并不是我们想要的代码。实际上,我正在寻找一个可以应用于数据帧并获得所需输出的函数。帮助表示赞赏。
解决方案
pandas.DataFrame.apply
使用自定义函数的一种方法:
def adult_victim(ser):
cnt = 0
for k, v in ser["participant_age_category"].items():
if (v, ser["participant_type_dic"][k]) == ("Adult", "Victim"):
cnt += 1
return cnt
temp2["adult_victim"] = temp2.apply(adult_victim, axis=1)
print(temp2)
输出:
gun_stolen id participant_age_category \
0 yes 0 {'1': 'Adult', '0': 'Adult'}
1 no 1 {'1': 'Teen', '0': 'Adult'}
2 yes 2 {'0': 'Adult'}
3 yes 3 {'1': 'Teen', '0': 'Adult'}
participant_type_dic adult_victim
0 {'1': 'Victim', '0': 'Victim'} 2
1 {'1': 'Suspect', '0': 'Victim'} 1
2 {'0': 'Victim'} 1
3 {'1': 'Victim', '0': 'Victim'} 1
推荐阅读
- laravel - HTTP 请求由 apache 处理,但不是由 Laravel 处理?
- encoding - Transformer模型中位置编码的实现细节?
- r - 在 ggplot 中需要帮助,使用误差条进行多因子条形图
- laravel-7 - 如何使用 php artisan serve 解决“参数过多...”错误
- mongodb - 如何在不覆盖 MongoDB 的情况下更新文档列表字段?
- java - Visual Studio Code 中的 Java 代码格式问题
- java - 从 json 中删除多余的空格
- azure-service-fabric - 可靠服务数据模型问题
- uicollectionview - UICollectionView 组合布局不会将水平项目滚动回开始
- contiki - 在 Contiki-NG 中访问根节点的每个节点的 RPL 邻居