Как в 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() ?


Ответы (0 шт):