GVKun编程网logo

Pandas:DataFrame.mean()非常慢。如何更快地计算列均值?(pandas 列均值)

22

此处将为大家介绍关于Pandas:DataFrame.mean的详细内容,并且为您解答有关非常慢。如何更快地计算列均值?的相关问题,此外,我们还将为您介绍关于Pandas-使用一个Dataframe列

此处将为大家介绍关于Pandas:DataFrame.mean的详细内容,并且为您解答有关非常慢。如何更快地计算列均值?的相关问题,此外,我们还将为您介绍关于Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame 跨组计算平均值、Pandas DataFrame使用另一个DataFrame列过滤行、Pandas Dataframe查找所有列均相等的行的有用信息。

本文目录一览:

Pandas:DataFrame.mean()非常慢。如何更快地计算列均值?(pandas 列均值)

Pandas:DataFrame.mean()非常慢。如何更快地计算列均值?(pandas 列均值)

我有一个相当大的CSV文件,它包含9917530行(无标题)和54列。列是实数或整数,只有一个包含日期。该文件上有一些NULL值,在将其nan加载到pandas后,这些值会转换为NULL
DataFrame

import pandas as pddata = pd.read_csv(''data.csv'')

加载后,我认为这非常快,导致它花费了大约30秒的时间(与使用Unix工具计算行数几乎同时wc),该过程大约需要4Gb的RAM(磁盘上文件的大小:2.2)
Gb。到目前为止一切顺利。

然后,我尝试执行以下操作:

column_means = data.mean()

该进程的占用内存非常快地增长到了约22Gb。我还可以看到处理器(一个内核)非常繁忙-
在大约三个小时后,我终止了该进程,因为我需要将计算机用于其他用途。我有一台运行Linux的非常快的PC-
它有2个处理器,每个处理器有4个内核,所以总共有8个内核,还有32 Gb RAM。我不敢相信计算列均值会花费这么长时间。

谁能解释为什么DataFrame.mean()这么慢?更重要的是,这样计算文件的列均值的更好方法是什么?我是否没有以最佳方式加载文件,应该使用其他功能代替DataFrame.mean()还是使用完全不同的工具?

提前谢谢了。

编辑。这是df.info()显示的内容:

<class ''pandas.core.frame.DataFrame''>Int64Index: 9917530 entries, 0 to 9917529Data columns (total 54 columns):srch_id                        9917530  non-null valuesdate_time                      9917530  non-null valuessite_id                        9917530  non-null valuesvisitor_location_country_id    9917530  non-null valuesvisitor_hist_starrating        505297  non-null valuesvisitor_hist_adr_usd           507612  non-null valuesprop_country_id                9917530  non-null valuesprop_id                        9917530  non-null valuesprop_starrating                9917530  non-null valuesprop_review_score              9902900  non-null valuesprop_brand_bool                9917530  non-null valuesprop_location_score1           9917530  non-null valuesprop_location_score2           7739150  non-null valuesprop_log_historical_price      9917530  non-null valuesposition                       9917530  non-null valuesprice_usd                      9917530  non-null valuespromotion_flag                 9917530  non-null valuessrch_destination_id            9917530  non-null valuessrch_length_of_stay            9917530  non-null valuessrch_booking_window            9917530  non-null valuessrch_adults_count              9917530  non-null valuessrch_children_count            9917530  non-null valuessrch_room_count                9917530  non-null valuessrch_saturday_night_bool       9917530  non-null valuessrch_query_affinity_score      635564  non-null valuesorig_destination_distance      6701069  non-null valuesrandom_bool                    9917530  non-null valuescomp1_rate                     235806  non-null valuescomp1_inv                      254433  non-null valuescomp1_rate_percent_diff        184907  non-null valuescomp2_rate                     4040633  non-null valuescomp2_inv                      4251538  non-null valuescomp2_rate_percent_diff        1109847  non-null valuescomp3_rate                     3059273  non-null valuescomp3_inv                      3292221  non-null valuescomp3_rate_percent_diff        944007  non-null valuescomp4_rate                     620099  non-null valuescomp4_inv                      692471  non-null valuescomp4_rate_percent_diff        264213  non-null valuescomp5_rate                     4444294  non-null valuescomp5_inv                      4720833  non-null valuescomp5_rate_percent_diff        1681006  non-null valuescomp6_rate                     482487  non-null valuescomp6_inv                      524145  non-null valuescomp6_rate_percent_diff        193312  non-null valuescomp7_rate                     631077  non-null valuescomp7_inv                      713175  non-null valuescomp7_rate_percent_diff        277838  non-null valuescomp8_rate                     3819043  non-null valuescomp8_inv                      3960388  non-null valuescomp8_rate_percent_diff        1225707  non-null valuesclick_bool                     9917530  non-null valuesgross_bookings_usd             276592  non-null valuesbooking_bool                   9917530  non-null valuesdtypes: float64(34), int64(19), object(1)None

答案1

小编典典

这与的大小相似,但没有对象列

In [10]: nrows = 10000000In [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.nanIn [13]: df.info()<class ''pandas.core.frame.DataFrame''>Int64Index: 10000000 entries, 0 to 9999999Data columns (total 53 columns):f0     9991000  non-null valuesf1     9991000  non-null valuesf2     9991000  non-null valuesf3     9991000  non-null valuesf4     9991000  non-null valuesf5     9991000  non-null valuesf6     9991000  non-null valuesf7     9991000  non-null valuesf8     9991000  non-null valuesf9     9991000  non-null valuesf10    9991000  non-null valuesf11    9991000  non-null valuesf12    9991000  non-null valuesf13    9991000  non-null valuesf14    9991000  non-null valuesf15    9991000  non-null valuesf16    9991000  non-null valuesf17    9991000  non-null valuesf18    9991000  non-null valuesf19    9991000  non-null valuesf20    10000000  non-null valuesf21    10000000  non-null valuesf22    10000000  non-null valuesf23    10000000  non-null valuesf24    10000000  non-null valuesf25    10000000  non-null valuesf26    10000000  non-null valuesf27    10000000  non-null valuesf28    10000000  non-null valuesf29    10000000  non-null valuesf30    10000000  non-null valuesf31    10000000  non-null valuesf32    10000000  non-null valuesf33    10000000  non-null valuesi0     10000000  non-null valuesi1     10000000  non-null valuesi2     10000000  non-null valuesi3     10000000  non-null valuesi4     10000000  non-null valuesi5     10000000  non-null valuesi6     10000000  non-null valuesi7     10000000  non-null valuesi8     10000000  non-null valuesi9     10000000  non-null valuesi10    10000000  non-null valuesi11    10000000  non-null valuesi12    10000000  non-null valuesi13    10000000  non-null valuesi14    10000000  non-null valuesi15    10000000  non-null valuesi16    10000000  non-null valuesi17    10000000  non-null valuesi18    10000000  non-null valuesdtypes: float64(34), int64(19)

时间(与您相似的机器规格)

In [14]: %timeit df.mean()1 loops, best of 3: 21.5 s per loop

您可以通过预先转换为浮点数来获得2倍的加速(平均值是这样做的,但是这样做的方式更通用,所以更慢)

In [15]: %timeit df.astype(''float64'').mean()1 loops, best of 3: 9.45 s per loop

您的问题是对象列。Mean将尝试为所有列进行计算,但是由于对象列的存在,所有内容都被转换为objectdtype,这对于计算效率不高。

最好的选择是做

 df._get_numeric_data().mean()

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

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe

我能够使用下面的方法获得所需的输出

df1.merge(df2,left_on = df2.prod_ref.str.extract(''(\d+)'',expand = False),right_on = df1.prod_id.str.extract(''(\d+)'',how = ''left'')

Pandas DataFrame 跨组计算平均值

Pandas DataFrame 跨组计算平均值

如何解决Pandas DataFrame 跨组计算平均值?

所以我有一个数据框,其中包含具有不同超参数的实验数据和一个名为 repeat_id 的特殊值,我们必须运行该值才能找到统计显着性。我基本上是在尝试计算不同 repeat_id 上任何其他记录值的平均值。这与计算组内均值的标准 GroupBy.mean 不同,这里我需要诸如 组均值之类的东西。示例:

   repeat_id variant  measuerment_0 measuerment_1 ... measuerment_n
0  0         ''A''      0.0           1.0               2.0
1  1         ''A''      0.2           0.4               0.6
2  0         ''B''      0.1           1.1               2.1
3  1         ''B''      0.3           0.5               0.7

预期输出:

   variant  measuerment_0 measuerment_1 ... measuerment_n
0  ''A''      0.1           0.7               1.3
1  ''B''      0.2           0.8               1.4

解决方法

您也可以使用 pivot_table() 函数执行此操作。

df.pivot_table(index=''variant'',aggfunc=''mean'').drop(columns=''repeat_id'')

Pandas DataFrame使用另一个DataFrame列过滤行

Pandas DataFrame使用另一个DataFrame列过滤行

我会做merge

out = df1.merge(df2[['col1','col2']],on = 'col1',suffixes = ('','1')).query('col3>=col21').drop('col21',1)

out
Out[15]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

reindex

out = df1[df1['col3'] >= df2.set_index('col1')['col2'].reindex(df1['col1']).values]
Out[19]: 
  col1  col2  col3  col4
1    A     2  0.80   200
2    A     2  0.90   300
3    A     3  0.95   400
4    A     3  0.85   500
5    B     2  0.65   600
6    B     2  0.75   700
9    B     3  0.75  1000

您还可以使用map

 df1.loc[df1.col3 >= df1.col1.map(df2.set_index("col1").col2)]
,

我的方法类似于@Ben_Yo的合并答案,但是代码更多,但也许更直接。

您只需:

  1. 合并该列并创建新的数据框 ZStack{ Rectangle() .frame(width: geometry.size.width,height: geometry.size.height/3.25) .shadow(radius: 5) .foregroundColor(Color.white) //Words ontop of the Rectangle VStack { HStack { Spacer() Text("Hello World") }.padding(.trailing,40) Spacer() //<-- PROBLEM HERE }//.offset(y: -40) }
  2. 根据条件(在本例中为s
  3. ),将数据名人s更改为返回TrueFalse的布尔系列。
  4. 最后,将s['col3'] >= s['col2']传递给s,结果将排除布尔系列df1中返回False的行:

s

Pandas Dataframe查找所有列均相等的行

Pandas Dataframe查找所有列均相等的行

我有一个包含字符的数据框-我想要按行的布尔结果,告诉我该行的所有列是否具有相同的值。

例如,我有

df = [  a   b   c   d0  ''C''   ''C''   ''C''   ''C''1  ''C''   ''C''   ''A''   ''A''2  ''A''   ''A''   ''A''   ''A'' ]

我希望结果是

0  True1  False2  True

我已经尝试过.all,但似乎只能检查是否都等于一个字母。我能想到的唯一另一种方法是在每一行上做一个唯一的,看看是否等于1?提前致谢。

答案1

小编典典

我认为最干净的方法是使用eq根据第一列检查所有列:

In [11]: dfOut[11]:    a  b  c  d0  C  C  C  C1  C  C  A  A2  A  A  A  AIn [12]: df.iloc[:, 0]Out[12]: 0    C1    C2    AName: a, dtype: objectIn [13]: df.eq(df.iloc[:, 0], axis=0)Out[13]:       a     b      c      d0  True  True   True   True1  True  True  False  False2  True  True   True   True

现在,您可以使用全部(如果它们都等于第一项,则它们都相等):

In [14]: df.eq(df.iloc[:, 0], axis=0).all(1)Out[14]: 0     True1    False2     Truedtype: bool

关于Pandas:DataFrame.mean非常慢。如何更快地计算列均值?的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于Pandas - 使用一个 Dataframe 列的子字符串比较两个 Dataframe、Pandas DataFrame 跨组计算平均值、Pandas DataFrame使用另一个DataFrame列过滤行、Pandas Dataframe查找所有列均相等的行的相关信息,请在本站寻找。

本文标签: