一种将更多列拆分为多列并加总其中两个的更有效的方法

问题描述 投票:1回答:1

示例代码:

import pandas as pd
df = pd.DataFrame({'id': [1, 2, 3], 'bbox': [[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]]})

目标:

df = pd.DataFrame({'id': [1, 2, 3], 'bbox': [[1.0, 2.0, 3.0, 4.0], [5.0, 6.0, 7.0, 8.0], [9.0, 10.0, 11.0, 12.0]], 'x1': [1, 5, 9], 'y1': [2, 6, 10], 'x2': [4, 12, 20], 'y2': [6, 14, 22]})

换句话说,我想在数据框中添加四个integer列,其中前两个只是bbox中每个列表的前两个元素,后两个分别是第一个和第一个元素的总和每个列表的第三个元素,以及第二个和第四个元素的和。目前,我这样做:

df[['x1', 'y1', 'w', 'h']] = pd.DataFrame(df['bbox'].values.tolist(), index=df.index).astype(int)
df.assign(x2 = df['x1']+df['w'], y2 = df['y1']+df['h'])
df.drop(['w', 'h'], axis = 1) 

对我来说似乎有点令人费解。是否有避免创建中间列wh的方法,还是会使代码的可读性降低?对我而言,可读性比保存一条代码行更为重要,因此,如果没有可读的替代方法,我将解决此问题。

python pandas assign
1个回答
3
投票
我认为您可以在第一步中创建x2y2

df1 = pd.DataFrame(df['bbox'].values.tolist(),index=df.index).astype(int) df[['x1', 'y1', 'x2', 'y2']] = df1 df = df.assign(x2 = df['x1']+df['x2'], y2 = df['y1']+df['y2']) print (df) id bbox x1 y1 x2 y2 0 1 [1.0, 2.0, 3.0, 4.0] 1 2 4 6 1 2 [5.0, 6.0, 7.0, 8.0] 5 6 12 14 2 3 [9.0, 10.0, 11.0, 12.0] 9 10 20 22

或使用+=

df1 = pd.DataFrame(df['bbox'].values.tolist(),index=df.index).astype(int) df[['x1', 'y1', 'x2', 'y2']] = df1 df['x2'] += df['x1'] df['y2'] += df['y1']

© www.soinside.com 2019 - 2024. All rights reserved.