我正在处理一个具有价格列的大型数据集(超过200万行x 10列)。这些值的格式包括一千点分隔符(例如 1.000),并且还使用点来分隔小数(例如 3.000.75 而不是 3000,75)。我想将列的格式设置为 float,但值中的 2 个点让我头疼。通常,为了简单起见,假设没有超过1.000.000的数字,我会做这样的事情for i in range (0,len(df)): cell=str(df.iloc[i]['price']) if cell.count(".")==2: cell=cell.split(".")[0] + cell.split(".")[1] + '.' + cell.split(".")[2]然后,是的,将列的格式设置为浮点数。但我知道这远非最优(循环)。for我怎样才能利用熊猫的力量来避免这里?for谢谢!
3 回答

喵喵时光机
TA贡献1846条经验 获得超7个赞
正如米尼奥所建议的那样,使用正则表达式删除它们。编码和阅读的一种简单方法是使用,这意味着所有非数字字符:\D
regex = r'\D' df.price = df.price.str.replace(regex, '').astype(float)

白衣非少年
TA贡献1155条经验 获得超0个赞
你可以尝试这样的事情:
df.price.str.replace(r'(\.)([0-9]{1,2})$', ',\\2')
也许你将不得不使用正则表达式部分,但这个函数是一种方法。

胡子哥哥
TA贡献1825条经验 获得超6个赞
在您的情况下,对何时删除点以及何时应将点视为小数点存在疑问。我对这个问题的解决方案是删除所有点,然后在一千个点之后出现s,并保持小数点不变。下面的代码可能会对您有所帮助。
cell = df['price']
cell = cell.astype('str')
def func(val):
ret = ''
for i in range(len(val)):
if val[i] != '.' or i%4 != 0:
ret += val[i]
return ret
output = pd.Series(map(func,cell))
output = output.astype('float')
print(output)
如果您遇到任何其他问题,可以写信给我。
添加回答
举报
0/150
提交
取消