熊猫to_csv,唯一记录数减少

时间:2018-09-24 09:35:59

标签: python python-3.x pandas

我正在将pandas数据帧写入csv文件。但是我发现唯一ID的数量在减少,但总行数却保持不变

下面您可以找到代码:

检查grouped_test的总数和唯一计数

SQL Server Database Engine type             .NET Framework type
date (SQL Server 2008 and later)            DateTime
datetime                                    DateTime
datetime2 (SQL Server 2008 and later)       DateTime
datetimeoffset (SQL Server 2008 and later)  DateTimeOffset

提交csv文件

inputlist = [[5 , -10 ] ,
           [10 , 3 ] ,
           [15 , -5 ]]

x = tf.Variable(initial_value=inputlist)

sess = tf.Session()
sess.run(tf.global_variables_initializer())

for i in range(x.get_shape().as_list()[1]) : #loop over columns
    print( sess.run(tf.contrib.distributions.percentile(tf.gather(x[:,i],
                                                                     tf.where(tf.greater(x[:,i],
                                                                                         0))),
                                                        50.0)))

再次读取相同的csv文件

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

读取文件时出现警告

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

检查计数

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

您可以发现唯一ID减少的数量,不知道可能是什么问题。

下面您可以找到一些Ids的样本值。 ID的长度/数据类型与它有关系吗?

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

2 个答案:

答案 0 :(得分:2)

首先,您认为整数的长度很重要。

让我们对数据进行一些实验以证明这一点。

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

答案 1 :(得分:1)

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

阅读时:

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

infer_objects()中也可能需要探索