我正在處理一個具有價格列的大型數據集(超過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
提交
取消