Рассчитать несколько столбцов по именам, используя панд Python - PullRequest
4 голосов
/ 24 июня 2019

У меня есть такой же фрейм данных,

cat_A  cat_B  cat_C  cat_D  dog_A  dog_B  dog_C  dog_D
  3      2      4      1      9      8      10     6
 ...
 ...

Я знал, как рассчитывать между столбцами, используя имена столбцов, например

df['ratio_A'] = df['cat_A']/df['dog_A']

cat_A  cat_B  cat_C  cat_D  dog_A  dog_B  dog_C  dog_D  ratio_A
  3      2      4      1      9      8      10     6      3/9

Но когда я попытался сгенерировать несколько столбцов путем вычисления каждого из этих столбцов, были ли еще какие-либо более простые способы вычисления всех столбцов и добавления новых столбцов по одному разу? Вместо

df['ratio_B'] = df['cat_B']/df['dog_B']

df['ratio_C'] = df['cat_C']/df['dog_C']

df['ratio_D'] = df['cat_D']/df['dog_D']

Когда длина столбца станет очень большой, будет много длинного кода для копирования и вставки. Нужно ли создавать 2 списка, как,

l1 = [cat_A, cat_B, cat_C, cat_D], l2= [dog_A, dog_B, dog_C, dog_D]

Тогда как использовать циклы for для реализации?

1 Ответ

5 голосов
/ 24 июня 2019

IMO хорошей практикой здесь будет работать с MultiIndex es вместо плоских столбцов:

df.columns = pd.MultiIndex.from_tuples(map(tuple, df.columns.str.split('_')))
df
  cat          dog          
    A  B  C  D   A  B   C  D
0   3  2  4  1   9  8  10  6

На данный момент вычисление отношения является очень простым выравниванием индекса вежливости.

df['cat'] / df['dog']
          A     B    C         D
0  0.333333  0.25  0.4  0.166667

res =  df['cat'] / df['dog']
res.columns = pd.MultiIndex.from_product([['ratio'], res.columns])

pd.concat([df, res], axis=1)
  cat          dog               ratio                     
    A  B  C  D   A  B   C  D         A     B    C         D
0   3  2  4  1   9  8  10  6  0.333333  0.25  0.4  0.166667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...