【问题标题】:Pandas dataframe column float inside string (i.e. "float") to intPandas 数据框列在字符串(即“float”)内浮动到 int
【发布时间】:2018-12-28 04:28:00
【问题描述】:

我正在尝试清理 pandas df 中的一些数据,并且我希望“volume”列从 float 变为 int。 编辑:主要问题是我正在查看的float 变量的dtype 实际上是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

【问题讨论】:

  • 我认为你想要if tick['volume'].dtype is not np.number 而不是!=is 检查它是否是同一个类(我可能忘记了那里的一些细微差别),而 != 检查相等的值。
  • @Engineero 应用时每个函数仍然显示相同的错误。当我没有tick[:,['volume']].astype(int) 时,if/else 有效,并返回“是”

标签: string pandas floating-point int conditional


【解决方案1】:

这里有一些问题。

在您的第一个示例中,iloc 仅接受 DataFrame 中的行和列的整数位置,这会产生您的错误。 IE。

tick.iloc[:,['volume']].astype(int)

不起作用。如果您想要基于标签的索引,请使用.loc

tick.loc[:,['volume']].astype(int)

或者,使用基于括号的索引,它允许您直接获取整列,而无需在行上使用切片语法 (:):

tick['volume'].astype(int)

接下来,astype(int) 返回一个新值,它不会就地修改。所以你想要的是

tick['volume'] = tick['volume'].astype(int)

至于你的 dtype 是一个数字检查,你不想检查== np.number,但你也不想检查is,它只返回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):

【讨论】:

  • 您的意思是tick[:, ['volume']] = tick.loc[:,['volume']].astype(int) 而不是tick['volume'] = tick['volume'].astype(int) 还是不需要包含行?另外,我将tick.iloc[] 更改为tick.loc[] 并从中取得了一些进展。我现在刚刚收到错误消息:ValueError: invalid literal for int() with base 10: '121489.05100000' 我假设这意味着我需要找到一种方法来处理 python 处理像 '.051 这样的 float-int 结尾的方式。不一定要你帮我解决这个新问题。对可能来到这里的其他人发表更多评论
  • tick.loc[:, col] 相当于没有行的tick[col]。此外,您不能将带小数的浮点数直接转换为整数。先回合,例如tick['volume'].round().astype(int)
猜你喜欢
  • 2016-02-28
  • 1970-01-01
  • 2018-03-06
  • 2018-01-07
  • 2018-07-15
  • 2012-10-28
  • 1970-01-01
相关资源
最近更新 更多