将pandas柱拆分为两个,将原始柱保持在原位

时间:2017-11-22 18:34:48

标签: python pandas

我有一个数据框,我需要将其分成两列,保持原始列的位置。

import pandas as pd
df = {'assigned_to': [
{'display_value': 'Michael', 'link': 'http://www.testlink.com'},
{'display_value': 'Vinod', 'link': 'http://www.testlink.com'},
{'display_value': 'Vinod', 'link': 'http://www.testlink.com'},
{'display_value': 'Carrie', 'link': 'http://www.testlink.com'},
{'display_value': 'Carrie', 'link': 'http://www.testlink.com'}]}
df = pd.DataFrame(df)

目前我正在尝试使用
df['assigned_to.display_value'] = df['assigned_to'].str.split(',', expand=True)

assigned_to.display_value提出了NaN人口。

我的预期结果是

     assigned_to.display_value    assigned_to.link          assigned_to
0    Michael                      http://www.testlink.com   {'display_value': 'Michael', 'link': 'http://www.testlink.com'}
1    Vinod                        http://www.testlink.com   {'display_value': 'Vinod', 'link': 'http://www.testlink.com'} 
2    Vinod                        http://www.testlink.com   {'display_value': 'Vinod', 'link': 'http://www.testlink.com'}
3    Carrie                       http://www.testlink.com   {'display_value': 'Carrie', 'link': 'http://www.testlink.com'}
4    Carrie                       http://www.testlink.com   {'display_value': 'Carrie', 'link': 'http://www.testlink.com'}

2 个答案:

答案 0 :(得分:2)

使用tolist将列转换为dicts列表,通过调用构造函数创建新的数据帧。

v = pd.DataFrame(df.assigned_to.tolist())
v

  display_value                     link
0       Michael  http://www.testlink.com
1         Vinod  http://www.testlink.com
2         Vinod  http://www.testlink.com
3        Carrie  http://www.testlink.com
4        Carrie  http://www.testlink.com

现在,您可以使用pd.concat将新列连接到原始列:

pd.concat([v, df], 1)

  display_value                     link  \
0       Michael  http://www.testlink.com   
1         Vinod  http://www.testlink.com   
2         Vinod  http://www.testlink.com   
3        Carrie  http://www.testlink.com   
4        Carrie  http://www.testlink.com   

                                         assigned_to  
0  {'link': 'http://www.testlink.com', 'display_v...  
1  {'link': 'http://www.testlink.com', 'display_v...  
2  {'link': 'http://www.testlink.com', 'display_v...  
3  {'link': 'http://www.testlink.com', 'display_v...  
4  {'link': 'http://www.testlink.com', 'display_v...  

<强>计时

df = pd.concat([df] * 10000)
df = df.reset_index(drop=1)
%%timeit
v = pd.DataFrame(df.assigned_to.tolist())
pd.concat([v, df], 1)

10 loops, best of 3: 58.7 ms per loop
%timeit df.assigned_to.apply(pd.Series)
1 loop, best of 3: 17.5 s per loop

答案 1 :(得分:2)

让我们使用:

df[['Display_value','link']] = df.assigned_to.apply(pd.Series)

输出:

                                         assigned_to Display_value  \
0  {'display_value': 'Michael', 'link': 'http://w...       Michael   
1  {'display_value': 'Vinod', 'link': 'http://www...         Vinod   
2  {'display_value': 'Vinod', 'link': 'http://www...         Vinod   
3  {'display_value': 'Carrie', 'link': 'http://ww...        Carrie   
4  {'display_value': 'Carrie', 'link': 'http://ww...        Carrie   

                      link  
0  http://www.testlink.com  
1  http://www.testlink.com  
2  http://www.testlink.com  
3  http://www.testlink.com  
4  http://www.testlink.com  

或者您可以使用assign并创建新的数据框:

df_out = df.assign(**df.assigned_to.apply(pd.Series))
print(df_out)

输出:

                                         assigned_to display_value  \
0  {'display_value': 'Michael', 'link': 'http://w...       Michael   
1  {'display_value': 'Vinod', 'link': 'http://www...         Vinod   
2  {'display_value': 'Vinod', 'link': 'http://www...         Vinod   
3  {'display_value': 'Carrie', 'link': 'http://ww...        Carrie   
4  {'display_value': 'Carrie', 'link': 'http://ww...        Carrie   

                      link  
0  http://www.testlink.com  
1  http://www.testlink.com  
2  http://www.testlink.com  
3  http://www.testlink.com  
4  http://www.testlink.com