问题描述
我正在写一个pandas数据帧到csv文件。 但是我可以发现,唯一ID的数量正在减少,但总行数保持不变
您可以在下面找到代码:
检查分组_测试的总计数和唯一计数
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减少的数量,任何想法可能是什么问题。
您可以在下面找到Ids的一些示例值。 id的长度/数据类型是否与它有关?
9844437513179813866
643697640977915618
1楼
首先,你猜测整数的长度是正确的。
让我们用数据做一些实验来证明这一点。
实验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})
2楼
排除任何数据类型问题的一种方法是将数据类型强制为整数(在保存到csv之前以及立即从csv读取)。
看完后:
result = pd.read_csv('result.csv')
result['fullVisitorId'] = result['fullVisitorId'].astype(int)
result['fullVisitorId'].nunique() , result['fullVisitorId'].count()
您还可以在infer_objects()中进行探索