无法将对象类型转换为字符串;然后对该字符串进行过滤;python数据帧
我正试图从纽约证券交易所(NYSE)撤出所有股票行情,然后只筛选出市值超过50亿美元的股票 我遇到了一个问题,因为根据我的数据加载方式,所有列都是数据类型“Object”,我无法找到将它们转换为其他任何内容的方法。请参见下面我的代码和注释:无法将对象类型转换为字符串;然后对该字符串进行过滤;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
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点起我就开始这么做了。是时候让我读一下正则表达式了。