我有一个相当大的CSV文件,它包含9917530行(不包括标题),以及54列。列是实数或整数,只有一个包含日期。文件中有一些NULL值,在我加载到pandas DataFrame后会被转换为nan
,我是这样做的:
import pandas as pd
data = pd.read_csv('data.csv')
加载完成后,我认为速度非常快,因为它只花了大约30秒的时间(与Unix工具wc
计算行数的时间几乎相同),该进程占用了约4GB的RAM(磁盘上文件的大小为2.2GB)。到目前为止一切顺利。
然后我尝试做以下操作:
column_means = data.mean()
这个进程的占用内存很快就增长到了约22GB。我还能看到处理器(一个核心)非常地繁忙——整整三个小时,之后我杀掉了这个进程,因为我需要使用机器做其他事情。我的电脑是一台带有Linux系统、有两个处理器,每个处理器有4个核心,总共是8个核心,还有32GB的RAM,我无法相信计算列均值会花费这么长的时间。
有人能解释一下为什么DataFrame.mean()这么慢吗?更重要的是,有什么更好的方法来计算这种类型文件的列均值吗?我没有以最佳方式加载文件吗?我应该使用不同于DataFrame.mean()的函数或完全不同的工具吗?
提前感谢大家。
编辑:以下是df.info()所显示的内容:
<class 'pandas.core.frame.DataFrame'>
Int64Index: 9917530 entries, 0 to 9917529
Data columns (total 54 columns):
srch_id 9917530 non-null values
date_time 9917530 non-null values
site_id 9917530 non-null values
visitor_location_country_id 9917530 non-null values
visitor_hist_starrating 505297 non-null values
visitor_hist_adr_usd 507612 non-null values
prop_country_id 9917530 non-null values
prop_id 9917530 non-null values
prop_starrating 9917530 non-null values
prop_review_score 9902900 non-null values
prop_brand_bool 9917530 non-null values
prop_location_score1 9917530 non-null values
prop_location_score2 7739150 non-null values
prop_log_historical_price 9917530 non-null values
position 9917530 non-null values
price_usd 9917530 non-null values
promotion_flag 9917530 non-null values
srch_destination_id 9917530 non-null values
srch_length_of_stay 9917530 non-null values
srch_booking_window 9917530 non-null values
srch_adults_count 9917530 non-null values
srch_children_count 9917530 non-null values
srch_room_count 9917530 non-null values
srch_saturday_night_bool 9917530 non-null values
srch_query_affinity_score 635564 non-null values
orig_destination_distance 6701069 non-null values
random_bool 9917530 non-null values
comp1_rate 235806 non-null values
comp1_inv 254433 non-null values
comp1_rate_percent_diff 184907 non-null values
comp2_rate 4040633 non-null values
comp2_inv 4251538 non-null values
comp2_rate_percent_diff 1109847 non-null values
comp3_rate 3059273 non-null values
comp3_inv 3292221 non-null values
comp3_rate_percent_diff 944007 non-null values
comp4_rate 620099 non-null values
comp4_inv 692471 non-null values
comp4_rate_percent_diff 264213 non-null values
comp5_rate 4444294 non-null values
comp5_inv 4720833 non-null values
comp5_rate_percent_diff 1681006 non-null values
comp6_rate 482487 non-null values
comp6_inv 524145 non-null values
comp6_rate_percent_diff 193312 non-null values
comp7_rate 631077 non-null values
comp7_inv 713175 non-null values
comp7_rate_percent_diff 277838 non-null values
comp8_rate 3819043 non-null values
comp8_inv 3960388 non-null values
comp8_rate_percent_diff 1225707 non-null values
click_bool 9917530 non-null values
gross_bookings_usd 276592 non-null values
booking_bool 9917530 non-null values
dtypes: float64(34), int64(19), object(1)None
df.info()
查看。object
应该仅用于字符串类(而不是数字)。 - Jeffdf.info()
的输出添加到问题中。我不太明白你所说的“应该只在类似字符串的数据上使用(而不是数字)”,你能解释一下吗? - piokuc