【问题标题】:pandas: extract or split char from number stringpandas:从数字字符串中提取或拆分字符
【发布时间】:2014-04-16 16:43:10
【问题描述】:

我从一个看起来像这样的 sql 表中选择了一个数据框

   id shares_float
0   1      621.76M
1   2      329.51M

换句话说,

[(1, '621.76M'), (2, '329.51M')]

我想拆分shares_float,如果它是“B”,则乘以1,000,000,000,如果是“M”,则乘以1,000,000,如果既不是或没有尾随字符,只需转换并分配数字。

结果应该是浮点型

   ticker_id  shares_float     float_value
0          1       621.76M    621760000.00
1          2         3.51B   3510000000.00

我是熊猫新手。有没有办法在熊猫中做到这一点?还是应该将数据转换为列表并在循环中进行操作,然后将其转换回 pandas DataFrame?

补充说明: 答案很好用!谢谢你。顺便说一句,该功能如何工作?

【问题讨论】:

    标签: python string pandas


    【解决方案1】:

    可以使用转换字典,我相信你不是说624540000

    In [9]:
    
    D={'M':'*1e6', 'B':'*1e9'}
    df['float_value']=df.shares_float.apply(lambda x: eval(x[:-1]+D[x[-1]]))
    In [10]:
    
    print df
       ticker_id shares_float  float_value
    0          1      621.76M   621760000
    1          2        3.51B  3510000000
    
    [2 rows x 3 columns]
    In [11]:
    
    df.dtypes
    Out[11]:
    ticker_id         int64
    shares_float     object
    float_value     float64
    dtype: object
    

    【讨论】:

    • 谢谢!这完美地工作。我只是好奇,eval(x[:-1]+D[x[-1]]) 是怎么工作的?
    • 一百万是1e6而不是10e6;同样10e9 是 100 亿。
    • 是的,对于额外的0 感到抱歉。 eval 基本上运行作为python 代码提供给它的string
    【解决方案2】:

    您可以使用字符串方法来提取模式;例如,为了涵盖所有情况,从:

    >>> df
       id shares_float
    0   1            5
    1   2           6M
    2   3           7B
    
    [3 rows x 2 columns]
    

    数值和单位可以通过以下方式提取:

    >>> sh = df.shares_float.str.extract(r'(?P<val>[0-9.]*)(?P<unit>[MB]{0,1})')
    >>> sh
      val unit
    0   5
    1   6    M
    2   7    B
    
    [3 rows x 2 columns]
    

    然后:

    >>> unit_map = {'':1, 'M':1e6, 'B':1e9}
    >>> df['float_value'] = sh.val.astype(np.float64) * sh.unit.map(unit_map)
    >>> df
       id shares_float  float_value
    0   1            5            5
    1   2           6M      6000000
    2   3           7B   7000000000
    
    [3 rows x 3 columns]
    

    【讨论】:

      猜你喜欢
      • 2016-10-07
      • 1970-01-01
      • 1970-01-01
      • 2020-06-10
      • 2020-12-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      相关资源
      最近更新 更多