2017-02-22 21 views
3

我想看看我是否可以从这个电话号码列中删除尾部零。如何在pandas中舍入/删除traling“.0”零?

实施例:

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。

另外空数据被认为是一个字符串,所以如果行是空的,它就是浮点数和字符串的混合。

回答

1

只是做

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

它使用的所有条目regex style lookup列并替换所有” 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 
+0

我试图做到这一点,但我得到一个错误=> *** TypeError:to_numeric()得到了一个意想不到的关键字参数'downcast''。这是我的代码'pd.to_numeric(data.phone,errors ='ignore',downcast ='integer')' – medev21

+0

你有什么版本的熊猫? – Nemo

+0

pandas版本是“0.18.1” – medev21

2

使用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 
+0

这是不工作的,因为在第一行的空数据,'*** ValueError:无效字面值long()以10为基数:'''。我不熟悉dtype对象,但看起来这是一个字符串。如我错了请纠正我。 – medev21

+0

我注意到,由于第一行是一个空的数据,它被认为是一个字符串,它会引发错误。有没有办法绕过它? – medev21

+0

你想要结果是为那一行。 – piRSquared

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

在熊猫/ NumPy的,整数不准取NaN值,和阵列/系列(包括列数据帧)是均匀的在它们的数据类型---所以具有整数的列中的某些条目是None/np.nan是彻头彻尾的impossible。编辑: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),这实际上并不影响你的数据。