【问题标题】:How to convert str to float in pandas如何将 str 转换为 pandas 中的浮点数
【发布时间】:2017-12-21 22:35:58
【问题描述】:

我正在尝试将我的数据集的字符串转换为浮点类型。这里有一些上下文:

import pandas as pd
import numpy as np
import xlrd
file_location = "/Users/sekr2/Desktop/Jari/Leistungen/leistungen2_2017.xlsx"
workbook = xlrd.open_workbook(file_location)
sheet = workbook.sheet_by_index(0)

df = pd.read_excel("/Users/.../bla.xlsx")

df.head()

    Leistungserbringer Anzahl Leistung     AL      TL      TaxW    Taxpunkte
 0  McGregor Sarah  12  'Konsilium'     147.28  87.47   KVG     234.75
 1  McGregor Sarah  12  'Grundberatung' 47.00   67.47   KVG     114.47
 2  McGregor Sarah  12  'Extra 5min'    87.28   87.47   KVG     174.75
 3  McGregor Sarah  12  'Respirator'    147.28  102.01  KVG     249.29
 4  McGregor Sarah  12  'Besuch'        167.28  87.45   KVG     254.73

为了继续努力,我需要找到一种方法来创建一个新列: df['Leistungswert'] = df['Taxpunkte'] * df['Anzahl'] * df['TaxW'].

TaxW 显示每个条目的字符串“KVG”。我从数据中知道'KVG' = 0.89。我试图将字符串转换为浮点数时碰壁了。我不能只使用浮点类型创建一个新列,因为此代码应该与进一步的输入一起使用。在 TaxW 列中,大约有 7 个具有不同值的不同条目。

感谢您提供有关此事的所有信息。

【问题讨论】:

  • 你能在上面提到'KVG' = 0.89的地方显示其他数据吗?
  • 我添加了截图。

标签: python string pandas dataframe type-conversion


【解决方案1】:

假设'KVG' 不是TaxW 中唯一可能的字符串值,您应该将字符串映射到对应的浮点数,如下所示:

map_ = {'KVG' : 0.89, ... } # add more fields here 

然后,你可以使用Series.map

In [424]: df['Leistungswert'] = df['Taxpunkte'] * df['Anzahl'] * df['TaxW'].map(map_); df['Leistungswert']
Out[424]: 
0    2507.1300
1    1222.5396
2    1866.3300
3    2662.4172
4    2720.5164
Name: Leistungswert, dtype: float64

或者,您可以使用df.transform

In [435]: df['Leistungswert'] = df.transform(lambda x: x['Taxpunkte'] * x['Anzahl'] * map_[x['TaxW']], axis=1); df['Lei
     ...: stungswert']
Out[435]: 
0    2507.1300
1    1222.5396
2    1866.3300
3    2662.4172
4    2720.5164
Name: Leistungswert, dtype: float64

【讨论】:

  • 我不确定它会不会像那样工作。但我没有注意到自 Pandas 0.20.0 以来我们有这样一个新功能 - 这对我来说是一个不错的发现
  • @MaxU 啊,对不起。应该放入一个工作示例。有用。需要指定axis=1。显然,它是矢量化的,所以它是一个有竞争力的替代方案。
  • @cᴏʟᴅsᴘᴇᴇᴅ 我在发布之前尝试过映射它,但我的版本不起作用:mapping = {'KVG' : 0.89, ...}df.applymap(lambda s: mapping.get(s) if s in mapping else s) 你的作品完美无缺,谢谢!
【解决方案2】:

使用来自@COLDSPEED 的map_ 映射的替代解决方案:

In [237]: df.assign(TaxW=df['TaxW'].map(map_)) \
            .eval("Leistungswert = Taxpunkte * Anzahl * TaxW", inplace=False)
Out[237]:
  Leistungserbringer  Anzahl       Leistung      AL      TL  TaxW  Taxpunkte  Leistungswert
0     McGregor Sarah      12      Konsilium  147.28   87.47  0.89     234.75      2507.1300
1     McGregor Sarah      12  Grundberatung   47.00   67.47  0.89     114.47      1222.5396
2     McGregor Sarah      12     Extra 5min   87.28   87.47  0.89     174.75      1866.3300
3     McGregor Sarah      12     Respirator  147.28  102.01  0.89     249.29      2662.4172
4     McGregor Sarah      12         Besuch  167.28   87.45  0.89     254.73      2720.5164

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-25
    • 2021-08-11
    • 1970-01-01
    • 2014-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多