Python 熊猫到_csv,唯一记录数量减少

Python 熊猫到_csv,唯一记录数量减少,python,python-3.x,pandas,Python,Python 3.x,Pandas,我正在将熊猫数据帧写入csv文件。然而,我可以发现唯一ID的数量正在减少,但总行数保持不变 您可以在下面找到代码: 检查分组测试的总计数和唯一计数 grouped_test['fullVisitorId'].nunique() , grouped_test['fullVisitorId'].count() (639230, 639230) 提交到csv文件 grouped_test.to_csv('result.csv',index=False) 再次读取相同的csv文件 result

我正在将熊猫数据帧写入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的数量减少了,你知道会有什么问题吗

下面您可以找到一些ID的示例值。id的长度/数据类型是否与此有关

9844437513179813866
643697640977915618

排除任何数据类型问题的一种方法是将数据类型强制为整数(在保存到csv之前,以及立即从csv读取数据)

经阅读:

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

在你可能想探索的infere_objects()中,你的猜测整数的长度是正确的

让我们用数据做一些实验来证明这一点

实验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

让我们试试
对象
格式

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
简而言之,您的问题的答案是将读取时的数据类型指定为
对象

df = pd.read_csv("result.csv", dtype={"fullVisitorId":object})

在保存到csv之前,请尝试以下操作:Try grouped_test['fullVisitorId']=grouped_test['fullVisitorId']。astype(int)