首页 > 解决方案 > 根据来自其他列的连接值定义列

问题描述

我有一个如下给出的数据框;

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})

但这并不是我们想要的代码。实际上,我正在寻找一个可以应用于数据帧并获得所需输出的函数。帮助表示赞赏。

标签: python-3.x

解决方案


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  

推荐阅读