Как использовать лямбда-функцию во фрейме данных pandas с помощью map / apply, где лямбда принимает разные значения для каждого столбца - PullRequest
0 голосов
/ 26 января 2019

Идея состоит в том, чтобы максимально быстро преобразовать фрейм данных в соответствии со значениями, характерными для каждого столбца.Для простоты, вот пример, где каждый элемент столбца сравнивается со средним значением столбца, которому он принадлежит, и заменяется на 0, если больше, чем среднее (столбец), или на 1 в противном случае.

In [26]: df = pd.DataFrame(np.array([[1, 2, 3], [4, 5, 6]]))                                                                                                                                                               

In [27]: df                                                                                                                                                                                                                
Out[27]: 
   0  1  2
0  1  2  3
1  4  5  6

In [28]: df.mean().values.tolist()                                                                                                                                                                                         
Out[28]: [2.5, 3.5, 4.5]

Фрагмент ниже, это не реальный код, а скорее пример желаемого поведения.Я использовал apply метод, но он может быть любым, который работает быстрее всего.

In [29]: f = lambda x: 0 if x < means else 1                                                                                                                                                                               

In [30]: df.apply(f)

In [27]: df                                                                                                                                                                                                                
Out[27]: 
   0  1  2
0  0  0  0
1  1  1  1 

Это забавный пример, но решение должно быть применено к большому фрейму данных, поэтому оно должно быть быстрым.

Ура!

1 Ответ

0 голосов
/ 26 января 2019

Вы можете создать логическую маску для фрейма данных, сравнивая каждый элемент со средним значением этого столбца.Это может быть легко достигнуто с помощью

df > df.mean()

    0       1       2
0   False   False   False
1   True    True    True

Поскольку True равен 1, а False - 0, логический фрейм данных можно легко преобразовать в целое с помощью astype.

(df > df.mean()).astype(int)

    0   1   2
0   0   0   0
1   1   1   1

Если вам нужнодля вывода нескольких строк, а не 0 и 1, используйте np.where, который работает как (условие, если true, иначе)

pd.DataFrame(np.where(df > df.mean(), 'm', 'n'))

    0   1   2
0   n   n   n
1   m   m   m

Редактировать: Обращаясь к qn в комментарии;Что если m и n зависят от столбца

df = pd.DataFrame(np.arange(12).reshape(4,3))

    0   1   2
0   0   1   2
1   3   4   5
2   6   7   8
3   9   10  11

pd.DataFrame(np.where(df > df.mean(), df.min(), df.max()))

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