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鲍勃