Цикл внутри имени столбца - PullRequest
       0

Цикл внутри имени столбца

0 голосов
/ 24 октября 2018

У меня есть фрейм данных со столбцами 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 '], но приведенный выше синтаксис выключен.

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

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

df.groupby(df.columns.str.split('_').str[0],axis=1).prod()[['car', 'van', 'bus']].sum(1)
0 голосов
/ 24 октября 2018

Чтобы исправить ваш код, вам нужно использовать 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...