我有一个数据框,我需要将其拆分为两列以保留原始列。
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'}
使用tolist
将列转换为字典列表,通过调用构造函数创建一个新的数据框。
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
我是一名优秀的程序员,十分优秀!