более питонический способ разбить столбец на несколько столбцов и сложить два из них - PullRequest
1 голос
/ 25 сентября 2019

Пример кода:

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]})

Словом, я хочу добавить четыре целых столбца к кадру данных, где первые дваэто только первые два элемента каждого списка в 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) 

Это кажется мне немного запутанным.Нет ли способа избежать создания промежуточных столбцов w и h или это сделает код менее читабельным?Читаемость является для меня более высоким приоритетом, чем сохранение одной строки кода, поэтому, если не будет читаемых альтернатив, я соглашусь на это решение.

1 Ответ

3 голосов
/ 25 сентября 2019

Я думаю, вы можете создать x2 и y2 на первом шаге:

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']
...