Отсутствующие значения в Pandas DataFrame всегда пустые при записи в CSV - PullRequest
1 голос
/ 05 марта 2020

Для этого примера я использую версию 1.0.1 из pandas.

У меня есть DataFrame со смешанными типами и некоторыми пропущенными значениями:

df = pd.DataFrame(
    [
        [1, 2.0, '2020-01-01', 'A String']
    ], columns = ['int', 'float', 'datetime', 'str']
)
df.loc[1] = [pd.NA, pd.NA, pd.NA, pd.NA]
df.datetime = pd.to_datetime(df.datetime)
print(df)
int   float   datetime    str
0 1   2.0 2020-01-01  A String
1 <NA>    NaN NaT NaN

Давайте распечатаем типы DataFrame, чтобы убедиться, что они соответствуют ожиданиям:

print(df.dtypes)
int                 object
float              float64
datetime    datetime64[ns]
str                 object
dtype: object

Теперь я хочу записать этот DataFrame в CSV file:

df.to_csv('test.csv', index=False)

Глядя на выходной CSV, все значения NaN заменяются пустой строкой. Я думаю, что это хорошо для строковых столбцов, но это не совсем оптимально для int, float или datetime столбцов.

Как я могу получить спецификацию столбца c представления отсутствующих значений ?

РЕДАКТИРОВАТЬ: Действительно возможно автоматически заполнить пропущенные значения, используя аргумент na_rep: df.to_csv('test.csv', na_rep='NA'). Тем не менее, он не позволяет указывать столбец c представлений.

РЕШЕНИЕ: Я думаю, что лучшее решение на данный момент - это вызвать fillna с помощью dict перед записью в CSV:

df.fillna(
    {'int': '<NA>', 'float': 'NaN', 'datetime': 'NaT'}
).to_csv('test.csv', index=False)

Ответы [ 3 ]

1 голос
/ 05 марта 2020

Нет никакого определенного c формата CSV, который определяет, какие значения должны быть. Есть несколько соглашений, но в конечном итоге это зависит от программы, которая впоследствии будет использовать csv.

Поэтому вы должны использовать функцию Pandas fillna для предоставления того, что вы хотите для каждой информации Тип, до экспорта.

1 голос
/ 05 марта 2020

Вы можете использовать fillna () для указанных c столбцов, чтобы получить то, что вы хотите. Например,

df['int column'].fillna(0)
df['string column'].fillna("NA")
1 голос
/ 05 марта 2020

Попробуйте это:

df.to_csv('test.csv', index=False,na_rep='NA')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...