我试图查看是否可以从此电话号码列中删除尾随零。
示例:
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。
此外,空数据被视为字符串,因此如果行为空,则它是浮点数和字符串的混合。
答案 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)
This answer删除一行中的结尾“ .0”。
df = df.round(decimals=0).astype(object)
答案 2 :(得分:3)
尝试使用str.isnumeric
和astype
的{{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
解决方案的优点:
答案 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中消失了。