【问题标题】:Why does Pandas Transpose Fail Without Error?为什么 Pandas 转置失败且没有错误?
【发布时间】: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?真奇怪。

标签: python pandas


【解决方案1】:

对于未来的读者,我找到了实际问题和解决方案,如果不是解释的话。感谢评论者提出的缩小问题范围的建议。创建大数据框的代码如下所示:

january_trips_df = pd.read_csv('chicago_taxi_trips_2016_01.csv')
february_trips_df = pd.read_csv('chicago_taxi_trips_2016_02.csv')
march_trips_df = pd.read_csv('chicago_taxi_trips_2016_03.csv')
april_trips_df = pd.read_csv('chicago_taxi_trips_2016_04.csv')
may_trips_df = pd.read_csv('chicago_taxi_trips_2016_05.csv')
june_trips_df = pd.read_csv('chicago_taxi_trips_2016_06.csv')
july_trips_df = pd.read_csv('chicago_taxi_trips_2016_07.csv')
august_trips_df = pd.read_csv('chicago_taxi_trips_2016_08.csv')
september_trips_df = pd.read_csv('chicago_taxi_trips_2016_09.csv')
october_trips_df = pd.read_csv('chicago_taxi_trips_2016_10.csv')
november_trips_df = pd.read_csv('chicago_taxi_trips_2016_11.csv')
december_trips_df = pd.read_csv('chicago_taxi_trips_2016_12.csv')

all_trips = pd.concat([january_trips_df,february_trips_df,march_trips_df,april_trips_df,
    may_trips_df,june_trips_df,july_trips_df,august_trips_df,september_trips_df,
    october_trips_df,november_trips_df,december_trips_df])

隔离问题后发现该索引的编号从 1 到 ~20,000,000 不一致。为了更正索引,我在 concat() 的调用中添加了参数ignore_index=True,代码运行良好,没有数据丢失。

我尝试使用较小的数据集重新创建问题,但无济于事。我不确定我是否偶然发现了错误,或者使用不一致的索引进行转置是否有意外行为(无论如何对我来说)。

【讨论】:

    猜你喜欢
    • 2016-05-06
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-08
    相关资源
    最近更新 更多