Pandas 将目录列表的一列转换为新列

Pandas 将目录列表的一列转换为新列,pandas,Pandas,我有这样一个熊猫数据框: ID Assigned 0 123 [{'COD': 990, 'NAME': 'Alice'}] 1 456 [{'COD': 990, 'NAME': 'Alice'}, {'COD': 991, 'NAME': 'Bob'}] 我需要将其转换为: ID COD NAME 123 990 Alice 456 990 Alice 456 991 Bob 如果列表中只有一个

我有这样一个熊猫数据框:

     ID    Assigned
0    123   [{'COD': 990, 'NAME': 'Alice'}]
1    456   [{'COD': 990, 'NAME': 'Alice'}, {'COD': 991, 'NAME': 'Bob'}]
我需要将其转换为:

ID    COD      NAME
123   990      Alice
456   990      Alice
456   991      Bob
如果列表中只有一个元素我知道(从其他SO答案中),我可以做类似的事情

pd.DataFrame(df['Assigned'].apply(lambda x: x[0]).tolist())

但是我一直在思考如何处理
分配的
列中的列表包含多个词典的情况(如第二行所示)。

这里有一个解决方案:

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

这里有一个解决方案:

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

另一个基于numpy和apply 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 ID代码名 0 123 990爱丽丝 1456990爱丽丝 2456991鲍勃
另一个基于numpy和apply 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 ID代码名 0 123 990爱丽丝 1456990爱丽丝 2456991鲍勃