代码之家  ›  专栏  ›  技术社区  ›  RustyShackleford

如何将数据帧中对象列中的“k”或“m”替换为000s,并替换非数字值?

  •  0
  • RustyShackleford  · 技术社区  · 7 年前

    我有一个类似这样的df,dtype is object can not cast to int or float:

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

    我该如何更换 k 具有 000 以及 m 具有 000000 在这个列中是object类型吗?

    此外,一旦我可以更换 我如何用零来代替不是数字的一切?

    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 回复  |  直到 7 年前
        1
  •  2
  •   sacuL    7 年前

    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
    
        2
  •  1
  •   user3483203    7 年前

    创建映射字典并使用 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
    
        3
  •  0
  •   Hassan Voyeau    7 年前

    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)