Панды делят несколько столбцов на основе их максимального значения - PullRequest
0 голосов
/ 27 августа 2018

У меня есть фрейм данных с 40 столбцами, где некоторые столбцы являются двоичными столбцами, содержащими только 0 или 1. Я хочу разделить все недвоичные столбцы столбцом с именем «size»

Сейчас я использую:

for i in range(df.shape[1]):
    col = df.iloc[:, i]
    if int(col.max()) > 1: # to check whether this column is binary
        df.iloc[:, i] = col/df['size']
    i+=1

Я чувствую, что мы должны избегать использования foor-loop в пандах, так есть ли более элегантный способ добиться этого?

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

ИМХО numpy и tolist здесь не нужны, у панд есть все для этой задачи:

вернуть все столбцы с максимальными значениями> 1 и выбросить 'size':

cols = df.columns[df.max()>1].drop('size')

и для расчета выбираются только полные столбцы, без подмножеств, поэтому вы можете оставить «ix» или «loc» и индексировать напрямую по именам столбцов:

df[cols] = df[cols].div(df['size'], 0)
0 голосов
/ 27 августа 2018

Должно работать что-то вроде следующего (при условии, что в кадре данных есть хотя бы один недвоичный столбец):

cols = df.columns[np.where(df.max(axis=0)>1)[0]].tolist() # find all non-binary column names
cols.remove('size') # exclude the column 'size' from the list, assuming that size is a non-binary column as well
df.loc[:,cols] = df.loc[:,cols].div(df.size, axis=0) # divide all the non-binary columns by size
#df.head()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...