Как заменить 'k' или 'm' тысячами из столбца объекта в кадре данных и заменить ненулевые значения? - PullRequest
0 голосов
/ 09 октября 2018

У меня есть df, который выглядит следующим образом, dtype это объект, который не может быть приведен к int или float:

col1
100
100k
100k-100m
10m
50

Как заменить k на 000 и m на000000 в этом столбце, который является объектом типа?

Кроме того, как только я могу заменить k или m, как мне заменить все, что не является числом, на ничто?

Новый df должен выглядеть следующим образом (а не пробел):

col1
100
100000

10000000
50

Пробовал этот код:

 df.col1 = (df.col1.replace(r'[KM]+$', '', regex=True).astype(float) * \
          df.col1.str.extract(r'[\d\.]+([KM]+)', expand=False)
             .fillna(1)
             .replace(['K','M'], [10**3, 10**6]).astype(int))

но столбцы должны быть плавающими

Ответы [ 3 ]

0 голосов
/ 09 октября 2018

Аналогично @ user3483203, но с str.translate вместо str.replace

df['col1'] = df.col1.str.translate(str.maketrans({'k':'000','m':'000000'}))
>>> df
               col1
0               100
1            100000
2  100000-100000000
3          10000000
4                50

# df['col1'] = pd.to_numeric(df.col1.str.translate(str.maketrans({'k':'000','m':'000000'})),errors='coerce')

#          col1
# 0       100.0
# 1    100000.0
# 2         NaN
# 3  10000000.0
# 4        50.0
0 голосов
/ 09 октября 2018

Это то, что я придумал.Дайте мне знать, что вы думаете.Я сделал дополнительную вещь, удалив десятичные разряды.

import pandas as pd

df = pd.Series(['100','100k','100k-100m','10m','50'])

df = df.str.replace('k', '000', regex=True)
df = df.str.replace('m', '000000', regex=True)
df = pd.to_numeric(df, errors='coerce')
df = df.apply(str).str.split('.', expand=True).iloc[ : , 0 ]

print(df)
0 голосов
/ 09 октября 2018

Создание словаря сопоставления и использование str.replace:

dct = {'k': '000', 'm': '000000'}

df.col1.str.replace(r'|'.join(dct.keys()), lambda x: dct[x.group()])

0                 100
1              100000
2    100000-100000000
3            10000000
4                  50
Name: col1, dtype: object

Если вы хотите удалить третью строку вместо замены, как в выходных данных:

(pd.to_numeric(df.col1.str.replace(r'|'.join(dct.keys()),
    lambda x: dct[x.group()]), errors='coerce'))

0         100.0
1      100000.0
2           NaN
3    10000000.0
4          50.0
Name: col1, dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...