Как в pandas при чтении read_csv() сохранить тип столбца int если в нем есть пропуски и заменить пропуски нулем?
Известно, что pandas при четнии csv-file read_csv() меняет тип столбца на float, если в нем есть NaN. Вот например:
like_csv_file = io.StringIO(
"""
text,int1,int2
text1, 1, 1
text2, ,2
text3, 3,
"""
)
x = pd.read_csv(like_csv_file)
print(x)
Выдаст такое
text int1 int2
0 text1 1 1.0
1 text2 2.0
2 text3 3 NaN
а
x.dtypes
Out[17]:
text object
int1 object
int2 float64
dtype: object
Относительно недавно появились специальные обозначения для типа int, предназначенные, как я понял, для преодоления этой ситуации при явном указании типов столбцов:
dtypes = dict(text='string', int1='Int32', int2='Int64')
x = pd.read_csv(r"D:\_\SNAP\like_csv.csv", dtype=dtypes, skipinitialspace=True,)
In [40]: print(x)
text int1 int2
0 text1 1 1
1 text2 <NA> 2
2 text3 3 <NA>
In [41]: x.dtypes
Out[41]:
text string
int1 Int32
int2 Int64
dtype: object
Меня лично устраивает, чтобы во время чтения для "целых" столбцов были автоматически заменены на ноль, но я не знаю, как это сделать, поэтому приходится делать еще одну команду:
x.loc[:,['int1','int2']] = x[['int1','int2']].fillna(0)
print(x)
text int1 int2
0 text1 1 1
1 text2 0 2
2 text3 3 0
Можно как то это сделать прямо при чтении read_csv() и только для целых столбцов, так как добавлять в "строковые" столбцы нули нехорошо.
Файлов читается много и приходится запоминать для каждой таблицы целочисленные столбцы, чтобы делать в них потом .fillna(0), хотелось бы делать это в момент считывания. Я это сделал вот так.
x = pd.read_csv(r"D:\_\SNAP\like_csv.csv", dtype=dtypes, skipinitialspace=True,).fillna(
value={key:0 for key, value in dtypes.items() if value in ('Int32', 'Int64')})
Но может есть какие-то более изящные и удобочитаемые способы?
Я имею ввиду - нет ли каких параметров или возможностей у самого read_csv() ?