将dicts列表的pandas列转换为新列

时间:2017-09-27 16:22:41

标签: pandas

我有一个像这样的pandas DataFrame:

@Echo Off

Set "RR=HKCU"
Set "RK=Software\Microsoft\Windows\CurrentVersion\Internet Settings"
Set "RV=ProxyEnable"

Reg Query "%RR%\%RK%" /F 1 /E /T REG_DWORD|Find /I "%RV%">Nul 2>&1||(
    Reg Add "%RR%\%RK%" /V "%RV%" /T REG_DWORD /D 0x1 /F>Nul)

我需要将其转换为:

     ID    Assigned
0    123   [{'COD': 990, 'NAME': 'Alice'}]
1    456   [{'COD': 990, 'NAME': 'Alice'}, {'COD': 991, 'NAME': 'Bob'}]

如果列表中只有一个我知道的元素(来自其他SO答案)我可以做类似

的事情
ID    COD      NAME
123   990      Alice
456   990      Alice
456   991      Bob

但我仍然坚持如何处理pd.DataFrame(df['Assigned'].apply(lambda x: x[0]).tolist()) 列中的列表包含多个词典(如第二行)中的情况。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

df=df.set_index('ID').Assigned.apply(pd.Series).stack().reset_index().drop('level_1',axis=1)
pd.concat([df,df[0].apply(pd.Series)],axis=1)

Out[78]: 
    ID                              0  COD   NAME
0  123  {'COD': 990, 'NAME': 'Alice'}  990  Alice
1  456  {'COD': 990, 'NAME': 'Alice'}  990  Alice
2  456    {'COD': 991, 'NAME': 'Bob'}  991    Bob

数据输入:

df=pd.DataFrame({'ID':[123,456],'Assigned':[[{'COD': 990, 'NAME': 'Alice'}],[{'COD': 990, 'NAME': 'Alice'}, {'COD': 991, 'NAME': 'Bob'}]]})

答案 1 :(得分:1)

另一种基于numpy的选项并应用pd.DataFrame即

ids = df['ID'][np.arange(len(df)).repeat(df.Assigned.str.len(), 0)]
ndf = pd.concat(df['Assigned'].apply(pd.DataFrame).values,0).set_index(ids).reset_index()

输出:

    ID  COD   NAME
0  123  990  Alice
1  456  990  Alice
2  456  991    Bob