无法将对象类型转换为字符串;然后过滤该字符串; python pandas dataframe

问题描述 投票:1回答:3

我试图从纽约证券交易所拉出所有股票代码,然后过滤掉那些市值高于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")]

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

python pandas
3个回答
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

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专栏只有一个字母。


0
投票

对象数据类型作为字符串。您应该能够同时使用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
© www.soinside.com 2019 - 2024. All rights reserved.