【问题标题】:How to get the maximum number of digits after the decimal point in a Pandas series如何获得熊猫系列中小数点后的最大位数
【发布时间】:2018-08-16 14:08:54
【问题描述】:

我从 csv 文件中将不同精度的浮点值列表读取到 Pandas 系列中,并且需要小数点后的位数。所以,对于 123.4567,我想得到 4。

我设法得到这样随机生成的数字的位数:

df = pd.Series(np.random.rand(100)*1000) precision_digits = (df - df.astype(int)).astype(str).str.split(".", expand=True)[1].str.len().max()

但是,如果我使用 pd.read_csv 从磁盘读取数据,其中某些行是空的(因此用 nan 填充),我会收到以下错误: Traceback (most recent call last): File "<input>", line 1, in <module> File "/home/tgamauf/workspace/mostly-sydan/venv/lib/python3.6/site-packages/pandas/core/generic.py", line 4376, in __getattr__ return object.__getattribute__(self, name) AttributeError: 'DataFrame' object has no attribute 'str'

这里出了什么问题? 有没有更好的方法来做我需要的事情?

【问题讨论】:

  • 你可以先把缺失的值补上fillna来防止错误的发生,不是吗?

标签: python pandas dataframe


【解决方案1】:

pd.read_csv() 通常返回一个DataFrame 对象。使用.str 返回的StringMethods 对象仅为Series 对象定义。尝试使用pd.read_csv('your_data.csv' , squeeze=True) 让它返回一个Series 对象;那么你就可以使用.str

【讨论】:

  • squeeze=True 解决了这个问题,但我注意到如果我加载整个数据框然后选择单个列(无论如何我都需要这样做),它甚至不适用。在这种情况下,它实际上是开箱即用的。无论如何,谢谢你,因为这确实回答了我提出的问题!
【解决方案2】:

例如,您有以下带有NaN 的数据。

df=pd.Series([1.111,2.2,3.33333,np.nan])

idx=df.index# record the original index 
df=df.dropna()# remove the NaN row 
(df - df.astype(int)).astype(str).str.split(".", expand=True)[1].str.len().reindex(idx)

【讨论】:

  • .reindex(idx) 在这里做什么?如果我使用 .max() 或 .reindex(idx).max(),结果对于我当前的数据集是相同的。
【解决方案3】:

带有df - df.astype(int) 的版本对我来说不能正常工作,只需应用相同的str.split 而没有它:

def get_max_decimal_length(df):
    """Get the maximum length of the fractional part of the values or None if no values present."""
    values = df.dropna()
    return None if values.empty else values.astype(str).str.split(".", expand=True)[1].str.len().max()

【讨论】:

    猜你喜欢
    • 2021-09-30
    • 2021-02-24
    • 2022-01-11
    • 1970-01-01
    • 2016-02-29
    • 1970-01-01
    • 2021-02-08
    • 2022-01-03
    • 2019-01-31
    相关资源
    最近更新 更多