Динамическая индексация среза строки в Pandas Dataframe - PullRequest
1 голос
/ 16 октября 2019

У меня есть столбец dataframe с одним целочисленным значением или диапазоном из двух целых чисел. Я хочу создать последний столбец, в котором значения диапазона усредняются, чтобы столбец становился чисто целочисленным.

Я пытаюсь использовать pandas.str.find ("-"), чтобы найти местоположение точки останова, а затем использовать np.where () для создания отдельных столбцов для первого значения и второго значения в диапазоне.

import numpy as np
import pandas as pd

d = {'A' : ['1234', '12 - 16'], 'Avg':[1234, 14]}
df= pd.DataFrame(d)

df['bp'] = df['A'].str.find("-")
df['F'] = np.where(df['bp']>0, df['A'].str.slice(0, df['bp']), df['A'])

Я получаю NAN, где диапазон присутствует в столбце. Ожидаемый результат находится в столбце «Avg».

Ответы [ 3 ]

2 голосов
/ 16 октября 2019

Использование str.split

df['A'].str.split(' - ').apply(lambda s: sum(map(int,s))/len(s),1)

0    1234.0
1      14.0
Name: A, dtype: float64
0 голосов
/ 16 октября 2019

Используйте extractall и звоните mean прямо на level=0

df.A.str.extractall(r'(\d+)').astype(int).mean(level=0)[0]

Out[64]:
0    1234
1      14
Name: 0, dtype: int32
0 голосов
/ 16 октября 2019

вы можете сделать это, используя векторизацию (без применения функции, как показано ниже), используя функцию str и взорваться (панды выше 0,25)

ваш индекс должен быть уникальным или вам нужно вызвать df.reset_index чтобы это работало

import pandas as pd

d = {'A' : ['1234', '12 - 16'], 'Avg':[1234, 14]}
df= pd.DataFrame(d)
df["A"].str.split("-").explode().astype(pd.np.int).groupby(level=0).mean()

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