Итерация по фрейму данных и использование метода замены на основе условий - PullRequest
0 голосов
/ 26 января 2020

Я пытаюсь перебрать указанный столбец c в моем фрейме данных.

Столбец:

df['column'] = ['1.4million', '1,235,000','100million',NaN, '14million', '2.5mill']

Я пытаюсь очистить этот столбец и в конечном итоге получить все целые числа для дальнейшей работы. Я застрял на шаге, чтобы вычистить «миллион». Я хотел бы заменить «миллион» пятью нулями, когда есть десятичная дробь (ie 1.4million становится 1.400000), и «миллион» шестью нулями, когда нет десятичной дроби (ie 100million становится 100000000).

Для упрощения, первый шаг, который я пытаюсь сделать, это просто сосредоточиться на фильтрации значений с десятичным числом и заменить их на 5 нулей. Я пытался использовать np.where для этого, однако я не могу использовать метод замены с numpy.

Я также пытался использовать pd.DataFrame.where, но получаю сообщение об ошибке:

for i,row in df.iterrows():
    df.at[i,'column'] = pd.DataFrame.where('.' in df.at[i,'column'],df.at[i,'column'].replace('million',''),df.at[i,'column'])

``AttributeError: 'numpy.ndarray' object has no attribute 'replace'

Я уверен, что здесь что-то отсутствует. (Я также уверен, что мне скажут, что мне не нужно использовать здесь иероглифы, поэтому я открыт для предложений по этому вопросу).

Ответы [ 3 ]

2 голосов
/ 26 января 2020

Учитывая данные примера - похоже, что вы можете вырезать запятые, а затем взять все цифры (и . символы) до строки mill или конца строки и разделить их, например:

x = df['column'].str.replace(',', '').str.extract('(.*?)(mill.*)?$')

Это даст вам:

         0        1
0      1.4  million
1  1235000      NaN
2      100  million
3      NaN      NaN
4       14  million
5      2.5     mill

Затем возьмите числовую часть и умножьте ее на миллион, где в столбце 1 есть что-то, умноженное на 1, например:

res = pd.to_numeric(x[0]) * np.where(x[1].notna(), 1_000_000, 1)

Это даст вам:

0      1400000.0
1      1235000.0
2    100000000.0
3            NaN
4     14000000.0
5      2500000.0
0 голосов
/ 26 января 2020

Для заданных данных:

df['column'].apply(lambda x: float(str(x).split('m')[0])*10**6
                   if 'million' in str(x) or 'mill' in str(x) else x)

Если в столбце может быть много форм миллионов, то поиск по регулярному выражению.

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

Попробуйте это:

df['column'].apply(lambda x : x.replace('million','00000'))

Убедитесь, что ваш dtype является строкой, прежде чем применять это

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