Я пишу файл данных 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
Начнем с того, что вы догадались, что длина целых чисел правильная.
Давайте сделаем некоторые эксперименты с данными, чтобы доказать это.
Эксперимент 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})
Один из способов исключить любые проблемы с типом данных - это обеспечить тип данных как целого (до сохранения в csv, а также немедленного чтения из csv.
После прочтения:
result = pd.read_csv('result.csv')
result['fullVisitorId'] = result['fullVisitorId'].astype(int)
result['fullVisitorId'].nunique() , result['fullVisitorId'].count()
В infer_objects() вы также можете изучить