【问题标题】:Cannot convert object type to string; and then filter on that string; python pandas dataframe无法将对象类型转换为字符串;然后过滤该字符串; python熊猫数据框
【发布时间】:2017-12-20 15:14:47
【问题描述】:

我正在尝试从 NYSE 提取所有股票代码,然后仅过滤掉那些市值高于 5B 的股票。

我遇到了一个问题,因为根据我的数据加载在所有列中的方式是数据类型“对象”,我无论如何都找不到将它们转换为其他任何内容。请参阅下面的代码和 cmets:

import pandas as pd
import numpy as np
# NYSE
url_nyse = "http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nyse&render=download"
df = pd.DataFrame.from_csv(url_nyse)
df = df.drop(df.columns[[0, 1, 3, 6,7]], axis=1) 

这是我对 NYSE 股票的初始数据加载,然后我只过滤 MarketCap、Sector 和 Industry。

起初我希望首先通过删除带有“M”的任何内容来过滤掉 MarketCap,然后删除第一个和最后一个字符以获得一个数字,然后可以过滤该数字以保持任何高于 5 的内容。但是我认为它是因为数据类型是“对象”而不是字符串,我无法直接做到这一点。所以我创建了只包含字母或数字的新列,希望我可以转换为数据类型字符串并从那里浮动。

df['MarketCap_Num'] = df.MarketCap.str[1:-1]
df['Billion_Filter'] = df.MarketCap.str[-1:]

所以 MarketCap_Num 列只有通过删除第一个和最后一个字符的数字,而 Billion_Filter 只是我将删除 = M 的任何值的最后一个字符。

但是,即使这些列只是数字或字符串,我无论如何也找不到从对象数据类型转换为更改,所以我的过滤根本不起作用。非常感谢任何帮助。

我试过 .astype(float), pd.to_numeric, type functions 都没有成功。

我的过滤代码将是:

df[df.Billion_Filter.str.contains("B")]

但是当我运行时没有任何反应,没有错误,也没有过滤器发生。当我在不同的表上运行此代码时,它可以工作,所以它必须是对象数据类型。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    MarketCap 列转换为浮点数,方法是首先删除美元符号,然后将B 替换为e9,将M 替换为e6。这应该便于在列上使用.astype(float) 进行转换。

    import pandas as pd
    import numpy as np
    
    
    # NYSE
    url_nyse = "http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exchange=nyse&render=download"
    df = pd.DataFrame.from_csv(url_nyse)
    df = df.drop(df.columns[[0, 1, 3, 6,7]], axis=1)
    
    df = df.replace({'MarketCap': {'\$': '', 'B': 'e9', 'M': 'e6', 'n/a': np.nan}}, regex=True)
    df.MarketCap = df.MarketCap.astype(float)
    
    print(df[df.MarketCap > 5000000000].head(10))
    

    产量:

               MarketCap             Sector                                         industry
    Symbol
    MMM     1.419900e+11        Health Care                       Medical/Dental Instruments
    WUBA    1.039000e+10         Technology  Computer Software: Programming, Data Processing
    ABB     5.676000e+10  Consumer Durables                              Electrical Products
    ABT     9.887000e+10        Health Care                            Major Pharmaceuticals
    ABBV    1.563200e+11        Health Care                            Major Pharmaceuticals
    ACN     9.388000e+10      Miscellaneous                                Business Services
    AYI     7.240000e+09  Consumer Durables                                Building Products
    ADNT    7.490000e+09      Capital Goods                                Auto Parts:O.E.M.
    AAP     7.370000e+09  Consumer Services                           Other Specialty Stores
    ASX     1.083000e+10         Technology                                   Semiconductors
    

    【讨论】:

    • 这是一个非常有效的解决方案,我得到的一个挂断是以下错误: ValueError: could not convert string to float: 'n/a' because there are some na in the data set;你遇到过这个问题吗?我无法让 dropna 工作,并且在您的代码中没有看到任何关于它的行。谢谢!
    • @user2420956,我根本没有遇到这个问题。您必须使用旧版本的 pandas。我建议你升级你的熊猫安装。否则,请查看我的编辑,将'n/a' 替换为np.nan
    • 我现在确实升级了,但仍然收到与 N/A 相关的错误,但您编辑的版本有效。非常感谢,这让我从美国东部标准时间早上 7 点开始。是时候阅读正则表达式等了。
    【解决方案2】:

    您应该可以使用以下方法更改MarketCap_Num 列的类型:

    df['MarketCap_Num'] = df.MarketCap.str[1:-1].astype(np.float64)
    

    然后您可以通过df.dtypes查看数据类型。

    至于过滤器,你可以简单地说

    df_filtered = df[df['Billion_Filter'] =="B"].copy()
    

    因为您的Billion_Filter 列中只有一个字母。

    【讨论】:

      【解决方案3】:

      Obhect 数据类型作为字符串工作。您应该能够同时使用 str.contains 并提取数字,而无需将对象类型转换为字符串

      df = df[df['MarketCap'].str.contains('B')].copy()
      df['MarketCap'] = df['MarketCap'].str.extract('(\d+.?\d*)', expand = False)
      
      
              MarketCap   Sector          industry
      Symbol          
      DDD     1.12        Technology      Computer Software: Prepackaged Software
      MMM     141.99      Health Care     Medical/Dental Instruments
      WUBA    10.39       Technology      Computer Software: Programming, Data Processing
      EGHT    1.32        Public UtilitiesTelecommunications Equipment
      AIR     1.48        Capital Goods   Aerospace
      

      【讨论】:

      • 噢...我喜欢正则表达式的用法!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-20
      • 1970-01-01
      相关资源
      最近更新 更多