панды to_csv, количество уникальных записей уменьшается - PullRequest
0 голосов
/ 24 сентября 2018

Я записываю фрейм данных pandas в файл csv.Однако я могу обнаружить, что количество уникальных идентификаторов уменьшается, но общее количество строк остается неизменным

Ниже вы можете найти код:

проверка общего количества и уникального числа grouped_test

 grouped_test['fullVisitorId'].nunique() , grouped_test['fullVisitorId'].count() 
(639230, 639230)

Отправка в файл CSV

grouped_test.to_csv('result.csv',index=False)

Повторное чтение того же файла CSV

result = pd.read_csv('result.csv')

При чтении файла я получил предупреждение ниже

py:2785: DtypeWarning: Columns (0) have mixed types. Specify dtype option on import or set low_memory=False.
  interactivity=interactivity, compiler=compiler, result=result)

проверка количества

result['fullVisitorId'].nunique() , result['fullVisitorId'].count()
(638932, 639230)

Вы можете найти количество уникальных идентификаторов, уменьшите любую идею, которая может быть проблемой.

Ниже вы можете найти некоторые примеры значений идентификаторов.Имеет ли отношение длина / тип данных к этому идентификатору?

9844437513179813866
643697640977915618

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Начнем с того, что вы предполагаете, что длина целых чисел верна.

Давайте проведем несколько экспериментов с данными, чтобы доказать это.

Эксперимент 1

Давайте посмотрим, какое наибольшее целое число может обработать Панда:

df = pd.DataFrame({"a":[9223372036854775899]})
df.to_csv("try.csv", index=False)
df1 = pd.read_csv("try.csv", dtype={"a":int})
df1

a
0   9223372036854775899


df = pd.DataFrame({"a":[92233720368547758100]})
df.to_csv("try.csv", index=False)
df2 = pd.read_csv("try.csv", dtype={"a":int})
df2

---------------------------------------------------------------------------
OverflowError                             Traceback (most recent call last)
pandas/_libs/parsers.pyx in pandas._libs.parsers.TextReader._convert_with_dtype()

pandas/_libs/parsers.pyx in pandas._libs.parsers._try_int64()

OverflowError: Overflow

Итак, вопрос в том, как нам правильно указать формат чисел

Эксперимент 2

df = pd.DataFrame({"a":[98444375131798787989138668, 98444375131798787989138669]})
df.to_csv("try.csv", index=False)
df3 = pd.read_csv("try.csv", dtype={"a":float})

df3.a.nunique()

1

Мы видим, что float ест числа

Эксперимент 3

Давайте попробуем object формат

df = pd.DataFrame({"a":[98444375131798787989138668, 98444375131798787989138669]})
df.to_csv("try.csv", index=False)
df4 = pd.read_csv("try.csv", dtype={"a":object})

df4.a.nunique()

2

Короче говоря, ответ на ваш вопрос - указать тип данных при чтении как object:

df = pd.read_csv("result.csv", dtype={"fullVisitorId":object})
0 голосов
/ 24 сентября 2018

Одним из способов исключить любые проблемы с типом данных было бы принудительное использование типа данных как целочисленного (перед сохранением в CSV, а также немедленное чтение из CSV.

После чтения:

result = pd.read_csv('result.csv')
result['fullVisitorId'] = result['fullVisitorId'].astype(int)
result['fullVisitorId'].nunique() , result['fullVisitorId'].count()

Существует также функция infer_objects (), которую вы, возможно, захотите изучить

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...