我有一个熊猫df,我需要弄平系列列
data = pd.DataFrame([['TRAN',[{'Name':'Ben','Age':'24'}],'T','Good'],
['LMI',[{'Name':'Zoe','Age':'32'}],'U','Better'],
['ARN',[{'Name':'Jack','Age':'28'}],'V','Best']
],
columns=['Type', 'Applicant', 'Decision', 'Action'])
data是pandas数据框,Applicant列是Series,
#data
type(data)
Out[25]: pandas.core.frame.DataFrame
#Applicant Column
type(data.Applicant)
Out[26]: pandas.core.series.Series
我需要展平序列,并使用列名'Type'
,'Applicant.Name'
,'Applicant.Age'
,'Decision'
,'Action'
转换数据框。
答案 0 :(得分:4)
不使用apply
(如果对性能至关重要)的解决方案将是:
data=(pd.DataFrame(data.pop('Applicant').str[0].values.tolist())
.add_prefix('Applicant.').join(data))
Applicant.Age Applicant.Name Type Decision Action
0 24 Ben TRAN T Good
1 32 Zoe LMI U Better
2 28 Jack ARN V Best
答案 1 :(得分:4)
如果每个列表有多个字典的一般解决方案-使用列表理解将索引值添加到新列,创建DataFrame
,添加DataFrame.add_prefix
,最后添加DataFrame.join
到原始列:
data = pd.DataFrame([['TRAN',[{'Name':'Ben','Age':'24'}, {'Name':'A','Age':'46'}],'T','Good'],
['LMI',[{'Name':'Zoe','Age':'32'}],'U','Better'],
['ARN',[{'Name':'Jack','Age':'28'}],'V','Best']
],
columns=['Type', 'Applicant', 'Decision', 'Action'])
df1 = pd.DataFrame([dict(x, **{'idx':k}) for k, v in data.pop('Applicant').items() for x in v])
.set_index('idx').add_prefix('Applicant.')
print (df1)
Applicant.Age Applicant.Name
idx
0 24 Ben
0 46 A
1 32 Zoe
2 28 Jack
df2 = data.join(df1).reset_index(drop=True)
print (df2)
Type Decision Action Applicant.Age Applicant.Name
0 TRAN T Good 24 Ben
1 TRAN T Good 46 A
2 LMI U Better 32 Zoe
3 ARN V Best 28 Jack
答案 2 :(得分:3)
使用pd.concat
和apply(pd.Series)
以及add_prefix
:
>>> pd.concat([data, data.pop('Applicant').str[0].apply(pd.Series).add_prefix('Applicant.')], axis=1)
Type Decision Action Applicant.Age Applicant.Name
0 TRAN T Good 24 Ben
1 LMI U Better 32 Zoe
2 ARN V Best 28 Jack
>>>
我将data
与DataFrame
以及已编辑的值连接起来。