如何舍入/删除traling" .0"大熊猫栏中的零?

时间:2017-02-22 22:59:15

标签: python pandas

我试图查看是否可以从此电话号码列中删除尾随零。

示例:

0
1      8.00735e+09
2      4.35789e+09
3      6.10644e+09

此列中的类型是一个对象,我试图将其舍入但我收到错误。我检查了其中几个我知道他们是这种格式" 8007354384.0",并希望摆脱带小数点的尾随零。

有时我收到的是这种格式,有时我不会,它们将是整数。我想检查电话列是否有尾随零,然后将其删除。

我有这段代码,但我仍然坚持如何检查每一行的尾随零。

data.ix[data.phone.str.contains('.0'), 'phone']

我收到错误=> *** ValueError: cannot index with vector containing NA / NaN values。我认为这个问题是因为某些行有空数据,有时我会收到这些数据。上面的代码应该能够跳过一个空行。

有人有什么建议吗?我是熊猫新手,但到目前为止,它是一个很有用的图书馆。我们将非常感谢您的帮助。

注意 上面提供的示例中,第一行有一个空数据,有时我会得到它。只是为了确保电话号码没有表示为0。

此外,空数据被视为字符串,因此如果行为空,则它是浮点数和字符串的混合。

11 个答案:

答案 0 :(得分:5)

使用astype(np.int64)

s = pd.Series(['', 8.00735e+09, 4.35789e+09, 6.10644e+09])
mask = pd.to_numeric(s).notnull()
s.loc[mask] = s.loc[mask].astype(np.int64)
s

0              
1    8007350000
2    4357890000
3    6106440000
dtype: object

答案 1 :(得分:4)

cs95的

This answer删除一行中的结尾“ .0”。

df = df.round(decimals=0).astype(object)

答案 2 :(得分:3)

尝试使用str.isnumericastype的{​​{1}}:

loc

现在:

s = pd.Series(['', 8.00735e+09, 4.35789e+09, 6.10644e+09])
c = s.str.isnumeric().astype(bool)
s.loc[c] = s.loc[c].astype(np.int64)
print(s)

输出:

print(s)

答案 3 :(得分:3)

这里是使用pandas nullable integers的解决方案(该解决方案假定输入Series值是空字符串或浮点数):

import pandas as pd, numpy as np
s = pd.Series(['', 8.00735e+09, 4.35789e+09, 6.10644e+09])
s.replace('', np.nan).astype('Int64')

输出(pandas-0.25.1):

0           NaN
1    8007350000
2    4357890000
3    6106440000
dtype: Int64

解决方案的优点:

  • 输出值为整数或缺少的值(不是'object'数据类型)
  • 高效

答案 4 :(得分:2)

只做

data['phone'] = data['phone'].astype(str)          
data['phone'] = data['phone'].str.replace('.0', ' ')

在列中的所有条目上使用regex style lookup,并将任何“.0”匹配替换为空格。例如

data = pd.DataFrame(
    data = [['bob','39384954.0'],['Lina','23827484.0']], 
    columns = ['user','phone'], index = [1,2]
)

data['phone'] = data['phone'].astype(str)
data['phone'] = data['phone'].str.replace('.0', ' ')
print data

   user     phone
1   bob  39384954
2  Lina  23827484

答案 5 :(得分:2)

在Pandas / NumPy中,不允许整数取NaN值,并且数组/系列(包括数据帧列)的数据类型是同构的---因此有一列整数,其中某些条目为np.nan / data.phone.astype('object')完全是impossible

编辑:str 应该做的伎俩;在这种情况下,Pandas将您的列视为一系列通用Python对象,而不是特定的数据类型(例如float / int / data.phone.astype(str).str.split('.', expand = True)[0]),如果您打算以性能为代价用这些数据运行任何繁重的计算(可能不是你的情况)。

假设您想保留这些NaN条目,您转换为字符串的方法是有效的可能性:

.replace

应该为您提供所需的内容(您可以使用其他字符串方法,例如.extract.split,但pd.set_option('display.float_format','{:.0f}'.format)似乎在这种情况下最直接的方法)

或者,如果您只对浮动的显示感兴趣(我不太可能想到),您可以执行{{1}},这实际上不会影响您的数据。

答案 6 :(得分:1)

import numpy as np
import pandas as pd

s = pd.Series([ None, np.nan, '',8.00735e+09,  4.35789e+09, 6.10644e+09])

s_new = s.fillna('').astype(str).str.replace(".0","",regex=False)
s_new

在这里,我用空字符串填充空值,将系列转换为字符串类型,用空字符串替换.0
输出:

0              
1              
2              
3    8007350000
4    4357890000
5    6106440000
dtype: object

答案 7 :(得分:1)

import numpy as np
tt = 8.00735e+09
time = int(np.format_float_positional(tt)[:-1])

答案 8 :(得分:0)

这取决于存储电话号码的数据格式。

如果是数字格式,则更改为整数可能会解决问题

df = pd.DataFrame({'TelephoneNumber': [123.0, 234]})
df['TelephoneNumber'] =  df['TelephoneNumber'].astype('int32')

如果它确实是一个字符串,您可以替换并重新分配该列。

df2 = pd.DataFrame({'TelephoneNumber': ['123.0', '234']})
df2['TelephoneNumber'] = df2['TelephoneNumber'].str.replace('.0', '')

答案 9 :(得分:0)

因此,当您具有混合类型的数据(例如某些行为NaN且某些具有int值)时,熊猫会通过查看数据类型自动分配数据类型,因此很有可能会分配userinfo或{{ 1}}

EX 1:

dtype: object

在上面的示例中,pandas假定数据类型为int64,原因是该行都不具有NaN,并且Phone列中的所有行均具有整数值。

EX 2:

float64

要回答您的实际问题,最后要消除.0,您可以执行以下操作

解决方案1:

import pandas as pd

data = [['tom', 10934000000], ['nick', 1534000000], ['juli', 1412000000]]
df = pd.DataFrame(data, columns = ['Name', 'Phone'])

>>> df
   Name        Phone
0   tom  10934000000
1  nick   1534000000
2  juli   1412000000

>>> df.dtypes
Name     object
Phone     int64
dtype: object

解决方案2:

 >>> data = [['tom'], ['nick', 1534000000], ['juli', 1412000000]]
 >>> df = pd.DataFrame(data, columns = ['Name', 'Phone'])
 >>> df

 Name         Phone
0   tom           NaN
1  nick  1.534000e+09
2  juli  1.412000e+09

>>> df.dtypes
Name      object
Phone    float64
dtype: object

答案 10 :(得分:0)

如果仍然有人感兴趣: 我遇到的问题是我将df取整并得到尾随零。 这就是我所做的。

new_df = np.round(old_df,3).astype(str)

然后所有结尾的零都在new_df中消失了。