Применение лямбды к кадру данных, но только до определенного количества строк - PullRequest
0 голосов
/ 25 апреля 2018

Мой фрейм данных похож на

a = {'A': {0: 40.1, 1: 40.1, 2: 40.1, 3: 45.45, 4: 41.6, 5: 39.6},
     'B': {0: 41.0, 1: 43.6, 2: 41.65, 3: 47.7, 4: 46.0, 5: 42.95},
     'C': {0: 826.0, 1: 835.0, 2: 815.0, 3: 169.5, 4: 170.0, 5: 165.5},
     'D': {0: 889.0, 1: 837.0, 2: 863.3, 3: 178.8, 4: 172.9, 5: 170.0}}

a = pd.DataFrame(a)

#a
       A      B      C      D
0  40.10  41.00  826.0  889.0
1  40.10  43.60  835.0  837.0
2  40.10  41.65  815.0  863.3
3  45.45  47.70  169.5  178.8
4  41.60  46.00  170.0  172.9
5  39.60  42.95  165.5  170.0

Я хочу разделить столбцы C и D на 5, но только до 2-го индекса

С помощью этого я пришелс

a.apply(lambda x: x/5 if 'C' in x.name or 'D' in x.name else x)

Как вы уже думали, он применяется ко всему столбцу.

Любой способ применить его только до 2-го индекса и сохранить их inplace

Ответы [ 2 ]

0 голосов
/ 25 апреля 2018

IIUC, чтобы разделить только столбцы C и D до (включая) индекса 2, вы можете сделать:

a.iloc[:3][["C", "D"]] /= 5

Что приводит к:

       A      B      C       D
0  40.10  41.00  165.2  177.80
1  40.10  43.60  167.0  167.40
2  40.10  41.65  163.0  172.66
3  45.45  47.70  169.5  178.80
4  41.60  46.00  170.0  172.90
5  39.60  42.95  165.5  170.00

Вышеуказанный метод быстрее, чем при использовании apply, но вот как изменить существующий код, чтобы получить тот же результат:

a.iloc[:3] = a.iloc[:3].apply(lambda x: x/5 if x.name in {"C", "D"} else x)

Разница в том, что он запускает применение только к фрагментуDataFrame, и назначает вывод обратно тому же срезу.

Обратите внимание, что мы срезаем [:3], потому что конечный индекс не включен в срез.Подробнее о понимании нотации среза Python .

Кроме того, вам не нужно проверять оба условия по отдельности - вы можете использовать x.name in {..}, чтобы проверить, содержится ли x.name в наборе.Использование set для проверки членства быстрее, чем использование list: Python Sets vs Lists .

0 голосов
/ 25 апреля 2018

Для индекса по умолчанию используйте loc для выбора:

a.loc[:2, ['C','D']] /= 5

Сведения :

print (a.loc[:2, ['C','D']])
       C      D
0  826.0  889.0
1  835.0  837.0
2  815.0  863.3

Общее решение для всего индексазначения (например, DatetimeIndex) используют get_indexer для позиций по именам столбцов и iloc для выбора:

a.iloc[:3, a.columns.get_indexer(['C','D'])] /= 5
print (a)
       A      B      C       D
0  40.10  41.00  165.2  177.80
1  40.10  43.60  167.0  167.40
2  40.10  41.65  163.0  172.66
3  45.45  47.70  169.5  178.80
4  41.60  46.00  170.0  172.90
5  39.60  42.95  165.5  170.00

Сведения :

print (a.iloc[:3, a.columns.get_indexer(['C','D'])])
       C      D
0  826.0  889.0
1  835.0  837.0
2  815.0  863.3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...