我对python
和pandas
很陌生。任何指导、评论和建议,不胜感激!
这是我的问题:在我打电话df.shape
或df.dtypes
后需要几分钟才能返回结果。DataFrame
有1,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.12Python: 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')
-
可以使用类型转换@Hai提到的方法来减小数据帧的大小。此外,请考虑使用
pd.Categorical
数据类型代替字符串。这会将字符串替换为引擎盖下的整数,这可能在减少内存使用方面具有最显着的改进。更多内容: https://www.dataquest.io/blog/pandas-big-data/ -
您还可以通过在导入步骤中使用带有
usecols
参数的pd.read_csv()
排除不必要的列来减小数据大小。 -
如果要在不一次读取整个数据集的情况下获取行和/或列计数,可以使用一种称为延迟计算/使用生成器的技术,该技术一次读取一行。我喜欢对在打开和进一步分析之前需要检查的大文件执行此操作。
发电机方法
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)