从字符串中提取数值并将其保存到数据框时遇到问题

时间:2019-06-08 07:18:15

标签: python pandas dataframe data-science

我是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

1 个答案:

答案 0 :(得分:0)

我将按照以下步骤进行操作:

Bookshelf

示例:

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)