熊猫数据帧显示形状或类型的速度很慢



我对pythonpandas很陌生。任何指导、评论和建议,不胜感激!

这是我的问题:在我打电话df.shapedf.dtypes后需要几分钟才能返回结果。DataFrame1,610,658行和5列。三列存储为int64,一列存储为float64,一列存储为datetime64

我使用以下代码在python中练习加载和转换。加载和转换都有很好的性能,但是我在检查输出时遇到了这个问题。

更新 1:

将一些列设置为索引后,df.shape时间从80+s 下降到1.7s,但df.dtypes仍保持在 80+s

import pandas as pd
###############
# Load
###############
raw = pd.read_csv("data.zip", compression='zip')
###############
# Transform
###############
payment_method = {
"Cash": 1
"Card": 2
}
df = raw. 
assign(
# Encode site ids to int. Only two sites in this data
site     = (raw.site == "A").astype(int),
# Encode payment types to int
payment  = 
[payment_method.get(k, 0) for k in raw.payment],
# Rescale values
amount   = raw.amount / 1e6,
# Convert integer date key to datetime
sold_date= pd.to_datetime(
[str(dt) for dt in raw. sold_date],
format="%Y%m%d")
)
###############
# Check point
###############
df.shape # pain point I. Took minutes to return
# Out[9]: (1610658, 5)
df.dtypes # pain point II
# Out[10]: 
# site                       int64
# acct_key                   int64
# sold_date         datetime64[ns]
# amount                   float64
# payment                    int64

如果我将数据框转换为numpy.ndarray,我可以立即得到结果。我想我一定错过了什么。请给我一些方向。

多谢!

系统: OS X 10.12

Python: 3.6.1
Numpy: 1.12
熊猫: 0.20.2
Jupyter 控制台: 5.1.0

尝试减小数据帧的大小:

int_columns = df.select_dtypes(include=["int"]).columns
df[int_columns] = df[int_columns].apply(pd.to_numeric, downcast='unsigned')
float_columns = df.select_dtypes(include=["float"]).columns
df[float_columns] = df[float_columns].apply(pd.to_numeric, downcast='float')
  1. 可以使用类型转换@Hai提到的方法来减小数据帧的大小。此外,请考虑使用pd.Categorical数据类型代替字符串。这会将字符串替换为引擎盖下的整数,这可能在减少内存使用方面具有最显着的改进。更多内容: https://www.dataquest.io/blog/pandas-big-data/

  2. 您还可以通过在导入步骤中使用带有usecols参数的pd.read_csv()排除不必要的列来减小数据大小。

  3. 如果要在不一次读取整个数据集的情况下获取行和/或列计数,可以使用一种称为延迟计算/使用生成器的技术,该技术一次读取一行。我喜欢对在打开和进一步分析之前需要检查的大文件执行此操作。

发电机方法

num_rows = 0
with open(r'/Users/Username/Downloads/data_set.csv') as file:
num_cols = len(file.readline().split(','))
try:
while next(file):
num_rows += 1
except StopIteration:
pass
shape = (num_rows, num_cols)
print(shape)

基本上是 pandasdf.shape的手动但内存密集度较低的实现:

import pandas as pd
df = pd.read_csv(r'/Users/Username/Downloads/data_set.csv')
print(df.shape)

最新更新