使用 讀取 csv 檔案時pandas.read_csv,似乎在使用關鍵字時,converters其他一些預處理引數(使用decimaland測驗na_values)似乎沒有效果。例子:
import pandas as pd
from io import StringIO
txt = "A B C\n12,5 4 xxx\n3,1 7 5,6\n8 n/a 7"
buffer = StringIO(txt)
converters = {i: lambda x: x for i in range(3)} # dummy converter
df1 = pd.read_csv(buffer, sep=" ", decimal=",", na_values=["xxx"])
buffer.seek(0)
df2 = pd.read_csv(buffer, sep=" ", decimal=",", na_values=["xxx"], converters=converters)
print(df1)
print(df2)
A B C
0 12.5 4.0 NaN
1 3.1 7.0 5.6
2 8.0 NaN 7.0
A B C
0 12,5 4 xxx
1 3,1 7 5,6
2 8 n/a 7
df1正確匯入,同時df2保留未轉換的字串(dtype:object)。顯然,一旦為列顯式定義了轉換器,引數decimal和就會被忽略。na_values即使是字串的集成默認 NA 轉換也會"n/a"失敗 ( keep_default_na=True)
問題:有沒有辦法一起使用converters 和其他預處理引數?或者我是否必須手動使用額外的十進制符號和 NA 值轉換器擴展我的應用程式特定轉換器?
uj5u.com熱心網友回復:
不,這是不可能的。即使檔案不清楚sep,decimal和thousands引數除了dtype:
如果指定了轉換器,則將應用它們代替 dtype 轉換。
將此引數視為僅由 的默認轉換器使用read_csv。
一種可能的解決方案是讓read_csv決議您的檔案,然后使用它assign來修改每列的值。
例如:
df = (pd.read_csv('input.csv', sep=';', decimal=',', thousands='_')
.assign(col1=lambda x: converters(x['col1']),
col2=lambda x: converters(x['col2']))
uj5u.com熱心網友回復:
我沒有詳細研究為什么會這樣,但看起來這取決于使用的引擎。您可以指定engine='python'以使其正常作業
import pandas as pd
from io import StringIO
txt = "A B C\n12,5 4 xxx\n3,1 7 5,6\n8 4 7"
buffer = StringIO(txt)
converters = {i: lambda x: x for i in range(3)} # dummy converter
df1 = pd.read_csv(buffer, sep=" ", decimal=",", na_values=["xxx"])
buffer.seek(0)
df2 = pd.read_csv(buffer, sep=" ", decimal=",", na_values=["xxx"], converters=converters, engine='python')
print(df1)
print(df2)
輸出:
A B C
0 12.5 4 NaN
1 3.1 7 5.6
2 8.0 4 7.0
A B C
0 12.5 4 NaN
1 3.1 7 5.6
2 8 4 7
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/487936.html
