Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 熊猫:DataFrame.mean()非常慢。如何更快地计算列的平均值?_Python_Performance_Pandas_Dataframe - Fatal编程技术网

Python 熊猫:DataFrame.mean()非常慢。如何更快地计算列的平均值?

Python 熊猫:DataFrame.mean()非常慢。如何更快地计算列的平均值?,python,performance,pandas,dataframe,Python,Performance,Pandas,Dataframe,我有一个相当大的CSV文件,它包含9917530行(没有标题)和54列。列是实数或整数,只有一列包含日期。文件上有几个空值,在我将其加载到pandasDataFrame后,这些值被转换为nan,我的做法如下: import pandas as pd data = pd.read_csv('data.csv') 加载后,我认为这是非常快的,因为它需要大约30秒(几乎与使用Unix工具计算行数的时间相同wc),这个过程需要大约4Gb的RAM(磁盘上的文件大小:2.2GB。到目前为止还不错) 然后我

我有一个相当大的CSV文件,它包含9917530行(没有标题)和54列。列是实数或整数,只有一列包含日期。文件上有几个空值,在我将其加载到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 PC-它有两个处理器,每个处理器有4个内核,所以总共有8个内核,32 Gb的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

INT64索引:9917530个条目,0到9917529
数据列(共54列):
srch_id 9917530非空值
日期时间9917530非空值
站点id 9917530非空值
访客\位置\国家\ id 9917530非空值
访客历史记录505297个非空值
访客历史adr 507612美元非空值
prop_country_id 9917530非空值
项目id 9917530非空值
由9917530个非空值组成的项目
prop_review_分数9902900非空值
prop_brand_bool 9917530非空值
道具位置得分1 9917530非空值
道具位置评分2 7739150非空值
道具日志历史价格9917530非空值
位置9917530非空值
价格为9917530美元非空值
升级标志9917530非空值
srch_destination_id 9917530非空值
srch_length_of_stay 9917530非空值
srch_预订_窗口9917530非空值
srch_成人计数9917530非空值
srch_children_count 9917530非空值
srch_room_计数9917530非空值
srch_saturday_night_bool 9917530非空值
srch_查询_亲和性_分数635564非空值
起始\目的\距离6701069非空值
随机布尔9917530非空值
补偿率235806非空值
comp1_inv 254433非空值
补偿率百分比差异184907非空值
补偿率4040633非空值
comp2_inv 4251538非空值
补偿率百分比差异1109847非空值
补偿率3059273非空值
comp3_inv 3292221非空值
补偿率百分比差异944007非空值
补偿率6200099非空值
comp4_inv 692471非空值
补偿率百分比差异264213非空值
补偿率44294非空值
comp5_inv 4720833非空值
补偿率百分比差异1681006非空值
补偿率482487非空值
comp6_inv 524145非空值
补偿率百分比差异193312非空值
补偿率631077非空值
comp7_inv 713175非空值
补偿率百分比差异277838非空值
补偿率3819043非空值
comp8_inv 3960388非空值
补偿率百分比差异1225707非空值
单击\u bool 9917530非空值
总预订量276592美元非空值
booking_bool 9917530非空值
数据类型:float64(34)、int64(19)、object(1)无

这是一个大小类似的from,但没有对象列

In [10]: nrows = 10000000

In [11]: df = pd.concat([DataFrame(randn(int(nrows),34),columns=[ 'f%s' % i for i in range(34) ]),DataFrame(randint(0,10,size=int(nrows*19)).reshape(int(nrows),19),columns=[ 'i%s' % i for i in range(19) ])],axis=1)

In [12]: df.iloc[1000:10000,0:20] = np.nan

In [13]: df.info()
<class 'pandas.core.frame.DataFrame'>
Int64Index: 10000000 entries, 0 to 9999999
Data columns (total 53 columns):
f0     9991000  non-null values
f1     9991000  non-null values
f2     9991000  non-null values
f3     9991000  non-null values
f4     9991000  non-null values
f5     9991000  non-null values
f6     9991000  non-null values
f7     9991000  non-null values
f8     9991000  non-null values
f9     9991000  non-null values
f10    9991000  non-null values
f11    9991000  non-null values
f12    9991000  non-null values
f13    9991000  non-null values
f14    9991000  non-null values
f15    9991000  non-null values
f16    9991000  non-null values
f17    9991000  non-null values
f18    9991000  non-null values
f19    9991000  non-null values
f20    10000000  non-null values
f21    10000000  non-null values
f22    10000000  non-null values
f23    10000000  non-null values
f24    10000000  non-null values
f25    10000000  non-null values
f26    10000000  non-null values
f27    10000000  non-null values
f28    10000000  non-null values
f29    10000000  non-null values
f30    10000000  non-null values
f31    10000000  non-null values
f32    10000000  non-null values
f33    10000000  non-null values
i0     10000000  non-null values
i1     10000000  non-null values
i2     10000000  non-null values
i3     10000000  non-null values
i4     10000000  non-null values
i5     10000000  non-null values
i6     10000000  non-null values
i7     10000000  non-null values
i8     10000000  non-null values
i9     10000000  non-null values
i10    10000000  non-null values
i11    10000000  non-null values
i12    10000000  non-null values
i13    10000000  non-null values
i14    10000000  non-null values
i15    10000000  non-null values
i16    10000000  non-null values
i17    10000000  non-null values
i18    10000000  non-null values
dtypes: float64(34), int64(19)
通过预转换为浮动,您可以获得2倍的加速(这意味着可以这样做,但以更一般的方式进行,因此速度较慢)

您的问题是对象列。Mean将尝试计算所有列,但由于对象列,所有内容都向上转换为
object
dtype,因此计算效率不高

最好的办法就是这样做

 df._get_numeric_data().mean()

有一个选项可以在较低级别执行此操作,但由于某些原因,我们不直接通过顶级函数(例如mean)支持此操作。我认为添加此参数会产生问题。但是默认情况下(不排除),问题可能是
False

您可以尝试这样的操作-

pd.DataFrame(data.descripe())


我注意到这比我在数据帧上使用mean的情况要快

您的数据类型可能定义不正确,show
df.info()
object
are应该只在字符串上(而不是在数字上)@Jeff谢谢,我添加了
df.info()的输出
关于这个问题。我不太明白你所说的“应该只在字符串上(而不是在数字上)”是什么意思,你能解释一下吗?什么版本的pandas/numpy?我相信它们是最新的稳定版本。
In [15]: %timeit df.astype('float64').mean()
1 loops, best of 3: 9.45 s per loop
 df._get_numeric_data().mean()