我正试图从纽约证券交易所提取所有股票代码,然后过滤掉那些MarketCap高于5B的股票代码。
我遇到了一个问题,因为基于我的数据加载在所有列中的来源是数据类型“对象”,我无论如何都找不到将它们转换为其他任何内容。请参阅下面的代码和评论:
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,Sector和Industry。
起初我希望首先过滤掉MarketCap,其中“M”被移除然后移除第一个和最后一个字符以获得一个数字,然后可以过滤以保持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,输入函数没有成功。
我的过滤代码将是:
df[df.Billion_Filter.str.contains("B")]
但是当我跑步时没有任何反应,没有错误但也没有过滤器发生。当我在另一个表上运行此代码时,它可以工作,因此它必须是保持它的对象数据类型。
答案 0 :(得分:2)
首先删除美元符号,然后将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
答案 1 :(得分:0)
您应该可以使用以下命令更改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
列中只有一个字母。
答案 2 :(得分:0)
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