【发布时间】:2021-09-03 01:39:25
【问题描述】:
当我对包含一列和约 2000 万行的 Dataframe 执行转置时,Pandas 删除了大约 1800 万个单元格,没有错误或异常。为什么?
我对数据框丢失数据并不感到惊讶——它可能内存不足,但我预计会出现错误。这让我想知道我是否不了解有关数据帧的重要内容。
在下面的sn-p代码中,你可以看到它显示并汇总了一列数据。然后它将列转换为一行,显示错误的值,愉快地计算错误的总和,然后愉快地完成,没有任何迹象表明出了什么问题。巧合的是,这两个总和看起来很相似,因为它们都以 1.5 开头,但如果你仔细观察,你会发现它们相差了一个数量级。我在 Windows 10 64 位系统上的 Visual Studio Code 中运行 Anaconda Python 3.7.8。
<Read in all of the Chicago taxi data from 2016 here...>
print('Isolating seconds...')
seconds = all_trips.iloc[:,3]
print(seconds)
print('Converting to int64...')
seconds = seconds.astype(dtype='Int64')
print(seconds)
print('Converting seconds series to data frame...')
pd_seconds = pd.DataFrame(seconds)
print(pd_seconds)
sum_seconds_column = pd_seconds.sum()
print('Sum of column: {0:.4e}.'.format(sum_seconds_column.values[0]))
print('Transposing column to row...')
# Loses data in the following line.
transpose_seconds = pd_seconds.T
print(transpose_seconds)
sum_seconds_row = transpose_seconds.sum(axis=1)
print('Sum of row: {0:.4e}.'.format(sum_seconds_row.values[0]))
输出是:
Isolating seconds...
0 180.0
1 240.0
...
1245710 2040.0
1245711 0.0
Name: trip_seconds, Length: 19866157, dtype: float64
正在转换为 int64...
0 180
1 240
...
1245710 2040
1245711 0
Name: trip_seconds, Length: 19866157, dtype: Int64
将秒数系列转换为数据框...
0 180
1 240
... ...
1245710 2040
1245711 0
[**19866157** rows x 1 columns]
列总和:1.5235e+10。
将列转换为行...
0 1 ... 1975106 1975107
trip_seconds 900 240 ... 180 0
[1 行 x 1975108 列]
行总和:1.5395e+09。
提前致谢。
【问题讨论】:
-
如果您尝试获取原始数据的子范围并分别测试它们会发生什么?例如,如果你使用前半部分数据时出现错误,而后半部分没有,那么问题肯定与前半部分的实际数据有关。另一方面,如果在一定大小的数据下无论做什么都无法重现问题,但在更大的数据上始终出现问题,那么它实际上是内存大小问题。
-
花了一点时间,但我的机器上的
pd_seconds = pd.DataFrame(np.random.randint(0, 2000, (19866157, 1))).astype(dtype='Int64')没有问题。如上所述,可能需要有关数据集的更多信息。尝试找出一个重现问题的可重现示例。 -
您是否注意到您的第一个输出显示长度为 19,666,157,但最后显示的行是 1,235,711?真奇怪。