如何舍入/删除 pandas 列中尾随的“.0”零?

问题描述 投票:0回答:12

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

示例:

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
。我认为问题是因为某些行有空数据,有时我确实收到了这些数据。上面的代码应该能够跳过空行。

有人有什么建议吗?我是 pandas 的新手,但到目前为止它是一个有用的库。我们将不胜感激您的帮助。

注意 上面提供的示例,第一行有一个空数据,我有时会这样做。只是为了确保电话号码不会表示为 0。

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

python pandas
12个回答
17
投票

使用

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

15
投票

在 Pandas/NumPy 中,整数不允许采用 NaN 值,并且数组/系列(包括数据框列)的数据类型是同质的 --- 因此,拥有一列整数,其中某些条目为

None
/
np.nan
是彻头彻尾不可能

编辑:

data.phone.astype('object')
应该可以解决问题;在这种情况下,Pandas 将您的列视为一系列通用 Python 对象,而不是特定的数据类型(例如
str
/
float
/
int
),如果您打算使用这些数据(可能不是你的情况)。

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

data.phone.astype(str).str.split('.', expand = True)[0]

应该可以提供您要查找的内容(您可以使用其他字符串方法,例如

.replace
.extract
,但
.split
在这种情况下似乎是最简单的)。

或者,如果您只对浮点数的显示感兴趣(我认为不太可能),您可以执行

pd.set_option('display.float_format','{:.0f}'.format)
,这实际上不会影响您的数据。


11
投票

cs95 的这个答案删除了一行中的尾随“.0”。

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

10
投票

就做吧

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

对列中的所有条目执行查找,并将任何“.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

9
投票
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

这里我用空字符串填充null值,将series转换为字符串类型,用空字符串替换

.0

输出:

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

4
投票

因此,当您有混合类型的数据时,例如某些行是 NaN,有些行具有 int 值,Pandas 通过查看事件中的数据类型来自动分配数据类型,它很可能会分配

dtype: object
float64

前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

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

前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

要回答您的实际问题,要在最后摆脱 .0,您可以执行类似的操作

解决方案1:

>>> data = [['tom', 9785000000.0], ['nick', 1534000000.0], ['juli', 1412000000]]
>>> df = pd.DataFrame(data, columns = ['Name', 'Phone'])
>>> df
   Name         Phone
0   tom  9.785000e+09
1  nick  1.534000e+09
2  juli  1.412000e+09

>>> df['Phone'] = df['Phone'].astype(int).astype(str)
>>> df
   Name       Phone
0   tom  9785000000
1  nick  1534000000
2  juli  1412000000

解决方案2:

>>> df['Phone'] = df['Phone'].astype(str).str.replace('.0', '', regex=False)
>>> df
   Name       Phone
0   tom  9785000000
1  nick  1534000000
2  juli  1412000000

3
投票

尝试将

str.isnumeric
astype
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)

输出:

0              
1    8007350000
2    4357890000
3    6106440000
dtype: object

3
投票

这是使用 pandas 可空整数的解决方案(该解决方案假设输入 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

解决方案的优点:

  • 输出值是整数或缺失值(不是“对象”数据类型)
  • 高效

2
投票

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

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

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', '')

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

0
投票

如果某人仍然有趣: 我遇到的问题是我对 df 进行四舍五入并得到尾随零。 这就是我所做的。

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

然后 new_df 中所有尾随零都消失了。


0
投票

我也面临着同样的问题,某些行中有空环。

这个 Python - 从字符串中删除小数和零链接最有帮助的答案帮助了我。

© www.soinside.com 2019 - 2024. All rights reserved.