麻烦遍历包含不规则嵌套列表的pandas列

时间:2020-07-23 19:16:50

标签: python-3.x pandas nested-lists

我已经注释了一些数据,并将每个注释作为列表存储在pd数据框列df ['Annotations']中。但是,该文档可能具有多个注释,从而导致嵌套列表。

例如:

[[[过去,自我],酒精],[[现在,自我],烟草]]

将有两个单独的注释,一个用于(过去,自我,酒精),另一个用于(现在,自我,烟草)

我很难遍历此专栏并根据每个注释的值更新其他专栏

下面列出了我的数据框:


       User    Annotations                           Temp   Experiencer   Tobacco   MJ    Alc.

       'xyz'    [[[past, self], alcohol],           
                 [[present, self],tobacco]]            0         0           0       0      0

       'aaa'    [[[general], marijuana]]               0         0           0       0      0 

       'bbb'    [[[past, other], alcohol], 
                 [[future, other], marijuana]]         0         0           0       0      0                                   

我希望结果数据框为每个子列表(注释)包含一行。理想情况下,它看起来像下面的temp列(0 =无,1 =过去,2 =现在,3 =将来),Experiencer列(0 =常规,1 =自我,2 =其他),其余列布尔值(当前为1,不存在为0):

       User      Temp   Experiencer   Tobacco   MJ   Alc.

       'xyz'      1          1           0      0     1

       'xyz'      2          1           1      0     0

       'aaa'      0          0           0      1     0 

       'bbb'      1          2           0      0     1 
         
       'bbb'      3          2           0      1     0
           

有人对如何将其应用于整个数据框的列有任何建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

该代码有点冗长,某些列名称不同,但是可以正常工作。

import pandas as pd

col_map = {
    'alcohol': 'Alc',
    'tobacco': 'Tobacco',
    'marijuana': 'MJ',
    'past': 1,
    'present': 2,
    'future': 3
}
col_map2 = {'general': 0,
            'self': 1,
            'other': 2}
dfdata = {
    'user': ['xyz', 'aaa', 'bbb'],
    'anno': [
        [[['past', 'self'], 'alcohol'], [['present', 'self'], 'tobacco']],
        [[['general'], 'marijuana']],
        [[['past', 'other'], 'alcohol'],
         [['future', 'other'], 'marijuana']]
    ],
    'Temp': [0] * 3,
    'Exp': [0] * 3,
    'Tobacco': [0] * 3,
    'MJ': [0] * 3,
    'Alc': [0] * 3
}
df = pd.DataFrame(data=dfdata, index=range(3))
col = 'anno'
newdf = pd.DataFrame(columns=[x for x in df.columns if x != col])
df.set_index('user', inplace=True)
i = 0
for us in df.index:
    annos = df.loc[us, 'anno']
    for rec in annos:
        newdf.loc[i, 'user' ] = us
        newdf.loc[i, col_map[rec[-1]]] = 1
        for elem in rec[0]:
            if elem in col_map:
                newdf.loc[i, 'Temp'] = col_map[elem]
            if elem in col_map2:
                newdf.loc[i, 'Exp'] = col_map2[elem]
        i += 1

newdf.fillna(0, inplace=True)
print(newdf)