панды to_csv, количество уникальных записей уменьшается

1

Я пишу файл данных 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)

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

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

9844437513179813866
643697640977915618
  • 0
    Попробуйте следующее перед сохранением в csv. Попробуйте grouped_test ['fullVisitorId'] = grouped_test ['fullVisitorId']. Astype (int)
Теги:
pandas
python-3.x

2 ответа

2
Лучший ответ

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

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

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

Посмотрим, что такое самое большое целое число, которое могут использовать Pandas:

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})
1

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

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

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

В infer_objects() вы также можете изучить

Ещё вопросы

Сообщество Overcoder
Наверх
Меню