无法将对象类型转换为字符串;然后对该字符串进行过滤;python数据帧

无法将对象类型转换为字符串;然后对该字符串进行过滤;python数据帧,python,pandas,Python,Pandas,我正试图从纽约证券交易所(NYSE)撤出所有股票行情,然后只筛选出市值超过50亿美元的股票 我遇到了一个问题,因为根据我的数据加载方式,所有列都是数据类型“Object”,我无法找到将它们转换为其他任何内容的方法。请参见下面我的代码和注释: import pandas as pd import numpy as np # NYSE url_nyse = "http://www.nasdaq.com/screening/companies-by-name.aspx?letter=0&exc

我正试图从纽约证券交易所(NYSE)撤出所有股票行情,然后只筛选出市值超过50亿美元的股票

我遇到了一个问题,因为根据我的数据加载方式,所有列都是数据类型“Object”,我无法找到将它们转换为其他任何内容的方法。请参见下面我的代码和注释:

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) 
这是我对纽约证券交易所股票的初始数据量,然后我只过滤市值、行业和行业

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

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,键入函数都没有成功

我的过滤代码是:

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

但当我运行时,什么都没有发生,没有错误,也没有过滤器发生。当我在另一个表上运行此代码时,它会工作,因此它必须是支持它的对象数据类型。

您应该能够使用以下命令更改
MarketCap\u Num
列的类型:

df['MarketCap_Num'] = df.MarketCap.str[1:-1].astype(np.float64)
然后可以通过
df.dtypes
检查数据类型

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

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

因为在
Billion\u过滤器
列中只有一个字母。

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

首先删除美元符号,然后用
e9
替换
B
,用
e6
替换
M
,将
MarketCap
列转换为浮动。这将使在列上使用
.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:无法将字符串转换为float:“n/a”,因为数据集中存在一些na;你遇到这个问题了吗?我不能让dropna工作,我在你的代码中没有看到任何关于它的行。谢谢@用户2420956,我根本没有遇到这个问题。您必须使用旧版本的
pandas
。我建议您升级您的pandas安装。否则,请查看我的编辑,我将
'n/a'
替换为
np.nan
。我现在确实升级了,但仍然出现了与n/a相关的错误,但您编辑的版本仍然有效。非常感谢,从美国东部时间早上7点起我就开始这么做了。是时候让我读一下正则表达式了。