Панды: попарное умножение столбцов на основе имени столбца - PullRequest
0 голосов
/ 14 декабря 2018

У меня есть следующий DataFrame

>>> df = pd.DataFrame({'ap1_X':[1,2,3,4], 'as1_X':[1,2,3,4], 'ap2_X':[2,2,2,2], 'as2_X':[3,3,3,3]})
>>> df
   ap1_X  as1_X  ap2_X  as2_X
0      1      1      2      3
1      2      2      2      3
2      3      3      2      3
3      4      4      2      3

Я хотел бы умножить ap1_X на as1_X и поместить это значение в as1_X, аналогично для ap2_X с as2_X.Общим идентификатором здесь является число, которое следует за ap или as.

Конечный фрейм данных должен выглядеть следующим образом

>>> df
   ap1_X  as1_X  ap2_X  as2_X
0      1      1      2      6
1      2      4      2      6
2      3      9      2      6
3      4      16     2      6

Я знаю, что могу циклически проходить по столбцам иумножить столбцы, имеющие один и тот же 3-й символ в имени столбца, но мне было интересно, есть ли более "панды" способ сделать это?

ОБНОВЛЕНИЕ: ИД числа в имени столбца может состоять из нескольких цифр(например: 1, 2, ..., 12, ..., 100).Таким образом, в основном, идентификатор - это число между «ap» или «as» и «_X».

Ответы [ 2 ]

0 голосов
/ 14 декабря 2018

Вы можете использовать filter здесь:

df.filter(like='p') * df.filter(like='s').values

   ap1_X  ap2_X
0      1      6
1      4      6
2      9      6
3     16      6

Другим решением является argsort имен столбцов и среза.Это должно быть очень эффективно.

idx = np.argsort(df.columns.str[1])
l = len(df) // 2
df.iloc[:, idx[:l]] * df.iloc[:, idx[l:]].values 

   ap1_X  ap2_X
0      1      6
1      4      6
2      9      6
3     16      6
0 голосов
/ 14 декабря 2018

Вы можете сделать groupby с axis=1, а ключ - это общее число

df.groupby(df.columns.str[2],axis=1).prod()
Out[73]: 
    1  2
0   1  6
1   4  6
2   9  6
3  16  6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...