如何用熊猫数据框中的系列展平列?

时间:2019-06-19 09:18:44

标签: python pandas

我有一个熊猫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'转换数据框。

3 个答案:

答案 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.concatapply(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
>>> 

我将dataDataFrame以及已编辑的值连接起来。