Pandas dataframe 列在字符串内浮动(即 "float")到 int
Pandas dataframe column float inside string (i.e. "float") to int
我正在尝试清理 pandas df 中的一些数据,我希望 'volume' 列从 float
变为 int
。
编辑:主要问题是我正在查看的 float
变量的数据类型实际上是 str
。所以首先它需要浮动,然后再改变。
我删除了我正在考虑的另外两个解决方案,并保留了我使用的那个。上一个是错误的,下一个是解决方案。
import pandas as pd
import numpy as np
#Call the df
t_df = pd.DataFrame(client.get_info())
#isolate only the 'symbol' column in t_df
tickers = t_df.loc[:, ['symbol']]
def tick_data(tickers):
for i in tickers:
tick_df = pd.DataFrame(client.get_ticker())
tick = tick_df.loc[:, ['symbol', 'volume']]
tick.iloc[:,['volume']].astype(int)
if tick['volume'].dtype != np.number:
print('yes')
else:
print('no')
return tick
修改后的代码如下:
import pandas as pd
#Call the df
def ticker():
t_df = pd.DataFrame(client.get_info())
#isolate only the 'symbol' column in t_df
tickers = t_df.loc[:, ['symbol']]
for i in tickers:
#pulls out market data for each symbol
tickers = pd.DataFrame(client.get_ticker())
#isolates the symbol and volume
tickers = tickers.loc[:, ['symbol', 'volume']]
#floats volume
tickers['volume'] = tickers.loc[:, ['volume']].astype(float)
#volume to int
tickers['volume'] = tickers.loc[:, ['volume']].astype(int)
#deletes all symbols > 20,000 in volume, returns only symbol
tickers = tickers.loc[tickers['volume'] >= 20000, 'symbol']
return tickers
你这里有一些问题。
在您的第一个示例中,iloc
只接受 DataFrame 中行和列的整数位置,这会产生您的错误。 IE。
tick.iloc[:,['volume']].astype(int)
不起作用。如果您想要基于标签的索引,请使用 .loc
:
tick.loc[:,['volume']].astype(int)
或者,使用基于括号的索引,它允许您直接获取整列,而无需在行上使用切片语法 (:):
tick['volume'].astype(int)
接下来,astype(int)
returns 一个新值,它不会就地修改。所以你想要的是
tick['volume'] = tick['volume'].astype(int)
至于你的dtype是一个数字校验,你不想校验== np.number
,但你也不想校验is
,它只returns True
如果它是 np.number
而不是像 np.int64
这样的子类。使用 np.issubdtype
或 pd.api.types.is_numeric_dtype
,即:
if np.issubdtype(tick['volume'].dtype, np.number):
或:
if pd.api.types.is_numeric_dtype(tick['volume'].dtype):
我正在尝试清理 pandas df 中的一些数据,我希望 'volume' 列从 float
变为 int
。
编辑:主要问题是我正在查看的 float
变量的数据类型实际上是 str
。所以首先它需要浮动,然后再改变。
我删除了我正在考虑的另外两个解决方案,并保留了我使用的那个。上一个是错误的,下一个是解决方案。
import pandas as pd
import numpy as np
#Call the df
t_df = pd.DataFrame(client.get_info())
#isolate only the 'symbol' column in t_df
tickers = t_df.loc[:, ['symbol']]
def tick_data(tickers):
for i in tickers:
tick_df = pd.DataFrame(client.get_ticker())
tick = tick_df.loc[:, ['symbol', 'volume']]
tick.iloc[:,['volume']].astype(int)
if tick['volume'].dtype != np.number:
print('yes')
else:
print('no')
return tick
修改后的代码如下:
import pandas as pd
#Call the df
def ticker():
t_df = pd.DataFrame(client.get_info())
#isolate only the 'symbol' column in t_df
tickers = t_df.loc[:, ['symbol']]
for i in tickers:
#pulls out market data for each symbol
tickers = pd.DataFrame(client.get_ticker())
#isolates the symbol and volume
tickers = tickers.loc[:, ['symbol', 'volume']]
#floats volume
tickers['volume'] = tickers.loc[:, ['volume']].astype(float)
#volume to int
tickers['volume'] = tickers.loc[:, ['volume']].astype(int)
#deletes all symbols > 20,000 in volume, returns only symbol
tickers = tickers.loc[tickers['volume'] >= 20000, 'symbol']
return tickers
你这里有一些问题。
在您的第一个示例中,iloc
只接受 DataFrame 中行和列的整数位置,这会产生您的错误。 IE。
tick.iloc[:,['volume']].astype(int)
不起作用。如果您想要基于标签的索引,请使用 .loc
:
tick.loc[:,['volume']].astype(int)
或者,使用基于括号的索引,它允许您直接获取整列,而无需在行上使用切片语法 (:):
tick['volume'].astype(int)
接下来,astype(int)
returns 一个新值,它不会就地修改。所以你想要的是
tick['volume'] = tick['volume'].astype(int)
至于你的dtype是一个数字校验,你不想校验== np.number
,但你也不想校验is
,它只returns True
如果它是 np.number
而不是像 np.int64
这样的子类。使用 np.issubdtype
或 pd.api.types.is_numeric_dtype
,即:
if np.issubdtype(tick['volume'].dtype, np.number):
或:
if pd.api.types.is_numeric_dtype(tick['volume'].dtype):