【问题标题】:Problem extracting a numeric value from a string and save to a Data Frame从字符串中提取数值并保存到数据框中的问题
【发布时间】:2019-10-23 13:15:32
【问题描述】:

我是 Python 新手,之前发布了我的问题并收到了其他人的建议,但仍然无法解决我的问题。我正在重新发布我的帖子,并进行了一些修改,并结合了其他人的建议。我不仅是 Python 新手,而且在表达我的问题时也遇到了问题。

我想将所有价格从字符串转换为数字,例如从“3K”转换为“3000”,以保持数据分析的一致性。目前,K表示千,就足够了,不需要进入数百万或数十亿。

这是在 Python 数据帧上完成的,我对迭代、列出和遇到我不理解的错误仍然不熟悉。

a) 我无法将字符串转换为浮点数。 “ValueError:无法将字符串转换为浮点数:”

b) 然后我决定转换为字符串,但我无法将它作为字符串存储在数据框中。我的输出是空单元格。

import pandas as pd
import numpy as np
import re 

def regex_filter(val):
    new_price = val
    if val:
        price = ' '
        mo = re.search('\d+[kK]',val)
        if mo:
            price = str(price).replace('K','000')
            print("The New value is ",price)
            new_price = price
            return new_price
        else:
            return new_price
    else:
        return new_price


if __name__ == "__main__": 

    df = pd.read_csv('ProductID_price.csv', encoding='utf8')
    df['price'] = df['price'].apply(regex_filter)

输入

    product_id  product_name                        price
0   1           Mares XR Kevlar Diving Dry Suit     3K
1   2           Beuchat Abyss Dry Diving Dry Suit   2050    
2   3           Typhoon Scuba Dive Dry Suit     1.5K
3   4           Scubapro Evertech Drysuit Men       4,059.99

输出

    product_id  product_name                        price
0   1   Mares XR Kevlar Diving Dry Suit 
1   2   Beuchat Abyss Dry Diving Dry Suit           2050
2   3   Typhoon Scuba Dive Dry Suit 
3   4   Scubapro Evertech Drysuit Men               4,059.99

【问题讨论】:

    标签: python pandas dataframe data-science


    【解决方案1】:

    我会这样做:

    def conv(s, conv_from="K", conv_to=1000):
        return s.mask(
            s.str.contains(f"\d+{conv_from}", na=False),
            pd.to_numeric(s.str.replace(conv_from,""), 
                          errors="coerce") * conv_to,
            errors="ignore")
    
    # get rid of commas and spaces    
    df["price"] = df["price"].str.replace(r"[\s,]", "")
    
    df["price"] = df["price"].pipe(conv, "[Kk]", 10**3).pipe(conv, "[Mm]", 10**6)
    

    例子:

    In [96]: df
    Out[96]:
          price
    0        3K
    1     0.56M
    2      2050
    3      1.5K
    4  4,059.99
    

    解决方案:

    In [97]: df["price"] = df["price"].str.replace(r"[\s,]", "")
    
    In [98]: df["price"] = df["price"].pipe(conv, "[Kk]", 10**3).pipe(conv, "[Mm]", 10**6)
    

    结果:

    In [99]: df
    Out[99]:
         price
    0     3000
    1   560000
    2     2050
    3     1500
    4  4059.99
    

    【讨论】:

    • 我在我的 Jupyter 上测试了你的代码,我收到了这个错误消息:
    • ParserError:数据标记错误。 C 错误:第 5 行中应有 1 个字段,看到 2
    • 我的原始代码也有同样的错误信息。重新启动我的 Jupyter 并重新启动我的电脑几次,我仍然收到相同的错误消息。
    • @Tony,你确定你测试过 my 代码吗?这个错误通常是由pd.read_* 方法引发的 - 我的代码中没有它
    • 谢谢 MaxU。它是文件,在我更正文件后它正在工作。我将再次测试您的代码,并让您知道结果。
    猜你喜欢
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 2015-05-31
    • 2021-12-26
    • 1970-01-01
    • 2017-04-19
    • 1970-01-01
    相关资源
    最近更新 更多