Использование операторов if else для лямбда-выражений во фрейме данных pandas на основе имен столбцов - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть фрейм данных df, который выглядит следующим образом:

import pandas as pd
df = pd.DataFrame({'a':[78.78, 77.26], 'b':[94.47,94.06], 'c':[0.72, 0.71], 'd':[0.19, 0.29]})

Для столбцов a, b и c Я хочу извлечь (в список) минимальные значения, а для столбца d Я хочу получить максимальное значение, т. Е.:

[77.26, 94.06, 0.71, 0.29]

В основном я пытаюсь сделать это с помощью лямбда-выражений

чтобы получить все минимальные значения, например, я мог бы:

df.apply(lambda x:x.min(), axis = 0)

Я думал о чем-то вроде (конечно, это не работает):

df_final.apply(lambda x:x.max() if x =='d' else x.min(), axis = 0)

Я нашел этот вопрос , который делает нечто подобное, хотя условный оператор основан на значениях каждого столбца, в то время как я хочу, чтобы мой оператор if else основывался на столбце имена. Дело в том, что x, т.е. повторяемый объект не является именами столбцов. Как я могу тогда применить если еще условия с лямбда-функциями, основанными на именах столбцов?

Ответы [ 5 ]

0 голосов
/ 06 ноября 2018

Использование describe

df.describe().loc['min','a':'c'].tolist()+df.describe().loc['max',['d']].tolist()
Out[276]: [77.26, 94.06, 0.71, 0.29]
0 голосов
/ 06 ноября 2018

Использовать agg со словарем:

df.agg({'a':'min','b':'min','c':'min','d':'max'}).tolist()

Выход:

[77.26, 94.06, 0.71, 0.29]
0 голосов
/ 06 ноября 2018

Вы можете использовать атрибут name в Серии:

df.apply(lambda x: x.max() if x.name == 'd' else x.min())
#a    77.26
#b    94.06
#c     0.71
#d     0.29
#dtype: float64

Наивный Сроки для справки, при условии, что у вас мало столбцов:

Малый фрейм данных:

df = pd.DataFrame({'a':[78.78, 77.26], 'b':[94.47,94.06], 'c':[0.72, 0.71], 'd':[0.19, 0.29]})
​    
%timeit df.apply(lambda x: x.max() if x.name == 'd' else x.min()).tolist()
# 770 µs ± 9.88 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.np.where(df.columns == 'd', df.max(), df.min()).tolist()
# 268 µs ± 7.93 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.agg({'a':'min','b':'min','c':'min','d':'max'}).tolist()
# 814 µs ± 22.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df[min_cols].min().tolist() + df[max_cols].max().tolist()
# 1.02 ms ± 11.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.describe().loc['min','a':'c'].tolist()+df.describe().loc['max',['d']].tolist()
# 18.7 ms ± 317 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

Большой фрейм данных:

df = pd.DataFrame({'a':[78.78, 77.26], 'b':[94.47,94.06], 'c':[0.72, 0.71], 'd':[0.19, 0.29]})
​
df = pd.concat([df] * 10000)

%timeit df.apply(lambda x: x.max() if x.name == 'd' else x.min()).tolist()
# 1.03 ms ± 16.1 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit pd.np.where(df.columns == 'd', df.max(), df.min()).tolist()
#1.81 ms ± 27.5 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.agg({'a':'min','b':'min','c':'min','d':'max'}).tolist()
# 1.07 ms ± 13.6 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df[min_cols].min().tolist() + df[max_cols].max().tolist()
# 1.9 ms ± 30.4 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit df.describe().loc['min','a':'c'].tolist()+df.describe().loc['max',['d']].tolist()
# 25.7 ms ± 752 µs per loop (mean ± std. dev. of 7 runs, 10 loops each)
0 голосов
/ 06 ноября 2018

В общем, старайтесь не использовать apply, потому что он не выполняет векторизованные операции (т.е. это медленно).

Здесь вы можете просто выбрать нужные столбцы и суммировать списки

min_cols = ['a', 'b', 'c']
max_cols = ['d']

>>> df[min_cols].min().tolist() + df[max_cols].max().tolist()
[77.26, 94.06, 0.71, 0.29]
0 голосов
/ 06 ноября 2018

Использование numpy.where:

a = np.where(df.columns == 'd', df.max(), df.min()).tolist()
print (a)
[77.26, 94.06, 0.71, 0.29]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...