У меня есть фрейм данных со столбцами car_x и car1_y, van2_x и van2_y, а также bus3_x и bus3_y. Мне нужен столбец car1_x * car1_y + van2_x * van2_y + bus3_x * bus3_y

Следующий код не работает:

modes = 'car', 'van', 'bus'

for mode in modes:
    df['{var}'] = df['{var}_x']*df['{var}_y']

Затем я бы просто суммировал по df ['car'], df ['van'] и df ['bus'], но приведенный выше синтаксис выключен.

3
Hamza 24 Окт 2018 в 03:41

2 ответа

Лучший ответ

Чтобы исправить ваш код, вам нужно будет использовать f-строки, чтобы python знал, что {var} должен быть вставлен как его значение, а не строка "{var}".

for mode in modes:
    df[f'{var}'] = df[f'{var}_x'] * df[f'{var}_y']

Но для этого потребуется дополнительный шаг суммы, чтобы получить «результат».

df['result'] = df[list(modes)].sum(axis=1)

Давайте вырежем дополнительный шаг и сделаем это намного быстрее, используя einsum здесь. Отфильтруйте столбцы _x и _y, а затем используйте einsum, чтобы указать операцию суммы продуктов.

x = df.filter(like='_x')
y = df.filter(like='_y')

df['result'] = np.einsum('ij,ij->i', x, y)

Благодаря шагу filter больше нет необходимости поддерживать отдельный список modes.

4
cs95 24 Окт 2018 в 00:49

Я буду использовать groupby

df.groupby(df.columns.str.split('_').str[0],axis=1).prod()[['car', 'van', 'bus']].sum(1)
2
YOBEN_S 24 Окт 2018 в 01:00
52959594