GVKun编程网logo

Python-通过熊猫DataFrame分组并选择最常用的值(pandas dataframe 分组)

9

此处将为大家介绍关于Python-通过熊猫DataFrame分组并选择最常用的值的详细内容,并且为您解答有关pandasdataframe分组的相关问题,此外,我们还将为您介绍关于DataFrame分

此处将为大家介绍关于Python-通过熊猫DataFrame分组并选择最常用的值的详细内容,并且为您解答有关pandas dataframe 分组的相关问题,此外,我们还将为您介绍关于DataFrame分组和聚合、Python DaskDataframe按列分组、Python Dataframe 分组排序和 Modin、Python DataFrame 按列分组,同时创建新列的有用信息。

本文目录一览:

Python-通过熊猫DataFrame分组并选择最常用的值(pandas dataframe 分组)

Python-通过熊猫DataFrame分组并选择最常用的值(pandas dataframe 分组)

我有一个包含三个字符串列的数据框。我知道第三列中的唯一一个值对于前两个的每种组合都有效。为了清理数据,我必须按前两列按数据帧分组,并为每种组合选择第三列的最常用值。

我的代码:

import pandas as pdfrom scipy import statssource = pd.DataFrame({''Country'' : [''USA'', ''USA'', ''Russia'',''USA''],                   ''City'' : [''New-York'', ''New-York'', ''Sankt-Petersburg'', ''New-York''],                  ''Short name'' : [''NY'',''New'',''Spb'',''NY'']})print source.groupby([''Country'',''City'']).agg(lambda x: stats.mode(x[''Short name''])[0])

最后一行代码不起作用,它显示“ Key error’Short name’”,如果我尝试仅按城市分组,则会收到AssertionError。我该如何解决?

答案1

小编典典

你可以value_counts()用来获取计数系列,并获取第一行:

import pandas as pdsource = pd.DataFrame({''Country'' : [''USA'', ''USA'', ''Russia'',''USA''],                   ''City'' : [''New-York'', ''New-York'', ''Sankt-Petersburg'', ''New-York''],                  ''Short name'' : [''NY'',''New'',''Spb'',''NY'']})source.groupby([''Country'',''City'']).agg(lambda x:x.value_counts().index[0])

DataFrame分组和聚合

DataFrame分组和聚合

一、分组

1、语法

grouped= df.groupby(by=''columns name'')
# grouped是一个DataFrameGroupBy对象,是可迭代的(遍历)
# grouped中的每一个元素都是一个元祖
# 元祖: (索引(分组的值), 分组之后的DataFrame)

2、取值

grouped.count()                 # 获取分组中非NaN的数量
grouped.count()[[''M'']]          # 获取M列索引的值, 注意 [[''M'']] 结果的type是DataFrame
grouped.count()[''M'']            # 获取M列索引的值, 注意 [''M''] 结果的type是Series

3、多个分组

# 多个分组
grouped= df.groupby(by=[''columns_name1'', ''columns_name2''])

# 获取分组后的某一部分数据
grouped = df1.groupby(by=[''O'', ''N''])
grouped.count()[''M'']
或
grouped[''M''].count()

# 对某几列数据进行分组
grouped = df1[''M''].groupby(by=[df1[''O''], df1[''N'']])     # Series
#
grouped = df1[[''M'']].groupby(by=[df1[''O''], df1[''N'']])     # DataFrame
grouped.count()

二、聚合
DataFrameGroupBy对象的聚合方法

函数名         说明
count         分组中非NA的数量
sum           非NA值的和
mean          非NA值的平均值
median        非NA值的中位数
std、var       标准差、方差
min、max       非NA值中的最小值、最大值

 

Python DaskDataframe按列分组

Python DaskDataframe按列分组

如何解决Python DaskDataframe按列分组?

我正在尝试在简单的数据帧上计算groupby操作:

import dask.dataframe as dd,t pandas as pd numpy as np
pdf = pd.DataFrame({''A'':[1,2,1],''B'':[4,5,6],''C'':[7,8,9],''D'':[1,3]})
pdf.columns=[''A'',''A'',''B'',''B'']
pdf.groupby(by=pdf.columns,axis=1).mean() # works

Out[83]: 
     A    B
0  2.5  4.0
1  3.5  5.0
2  3.5  6.0

但是很快:

ddf = dd.from_pandas(pdf,npartitions=1) 
#group = ddf.groupby(by=ddf.columns,axis=1).mean() #breaks
#group = ddf.groupby(by=list(ddf.columns),axis=1).mean() #breaks
TypeError: __init__() got an unexpected keyword argument ''axis''

文档说明(坐标轴:{0或“索引”,1或“列”},默认为0(在dask中不受支持)`)。 有工作区吗?

作为参考,沿着axis=0分组时不会发生这种情况:

pdf = pd.DataFrame({''A'':[1,3]})   
pdf.groupby(''A'').mean()
ddf = dd.from_pandas(pdf,npartitions=1)
ddf.groupby(''A'').mean().compute()

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

Python Dataframe 分组排序和 Modin

Python Dataframe 分组排序和 Modin

Python Dataframe 分组排序和 Modin

 

1、按照其中一列进行排序

在dataframe中,按照其中的一列排序:比如q值倒排

(1)rank方法

data[''new_rank''] = data.groupby(''house_code'')[''q_score_new''].rank(ascending=False, method=''dense'')

(2)sort_values方法

data.sort_values([''q_score_new''], ascending=False).groupby([''house_code'']).cumcount() + 1

2、按照其中多列进行排序

在dataframe中,按照其中的多列排序:比如q值倒排、经纪人ucid正排

sort_values方法

(1)dsort_values方法ata.sort_values([''q_score_new'', ''agent_ucid''], ascending=[ False, True]).groupby([''house_code'']).cumcount() + 1 # 20多秒(100多万行数据集上)

(2)data = data.groupby(''house_code'').sort_values(by=[''q_score_new'', ''agent_ucid''], ascending=(False, True)).groupby(''house_code'').apply(f) # 200多秒(100多万行数据集上)


    def f(df):
        df[''new_rank''] = range(1, len(df) + 1)
        return df

最终结果显示:第一种比第二种()快10倍左右(在200万行数据集上),所以推荐第二种!!!

3、modin

(1)简介

Modin 是加州大学伯克利分校 RISELab 的一个早期项目,旨在促进分布式计算在数据科学领域的应用。它是一个多进程的数据帧(Dataframe)库,具有与 Pandas 相同的应用程序接口(API),使用户可以加速他们的 Pandas 工作流。

(2)原理

从本质上讲,Modin 所做的只是增加了 CPU 所有内核的利用率,从而提供了更好的性能。

(3)安装使用

Modin 是完全开源的,可以通过下面的 GitHub 链接获得:

https://github.com/modin-project/modin

我们可以使用如下所示的 PyPi 指令来安装 Modin:

pip install modin

在 Windows 环境下,Ray 是安装 Modin 所需的依赖之一。Windows 本身并不支持 Ray,所以为了安装它,用户需要使用 WSL(适用 Linux 的 Windows 子系统,适用Linux和mac)

(4)性能提升

pandas的内置函数(比如groupby等)因为优化的很好,所以和modin.pandas处理速度差不多,提升主要提现在数据读取上。 通常,Modin 使用「read_csv」函数读取 2G 数据需要 2 秒,而 读取 18G 数据大约需要不到 18 秒。

%%time
import pandas 
pandas_csv_data = pandas.read_csv("../800MB.csv")
-----------------------------------------------------------------
CPU times: user 26.3 s, sys: 3.14 s, total: 29.4s
Wall time: 29.5 s
%%time
import modin.pandas
modin_csv_data = pd.read_csv("../750MB.csv")
-----------------------------------------------------------------
CPU times: user 76.7 ms, sys: 5.08 ms, total: 81.8 ms
Wall time: 7.6 s

(5)未来

Modin 项目仍处于早期阶段,但对 Pandas 来说是一个非常有发展前景的补充。Modin 为用户处理所有的数据分区和重组任务,这样我们就可以集中精力处理工作流。Modin 的基本目标是让用户能够在小数据和大数据上使用相同的工具,而不用考虑改变 API 来适应不同的数据规模

Python DataFrame 按列分组,同时创建新列

Python DataFrame 按列分组,同时创建新列

如何解决Python DataFrame 按列分组,同时创建新列?

我在 Pandas 中有一个 DataFrame 看起来像

memberid ticketid agegrp c1 c2 c3 d1 日期
1 1 1 A A AA 2019-01-01
1 1 1 A A AB 2019-01-02
1 1 1 A A C AC 2019-01-01
1 2 1 A D C AA 2019-02-01
1 2 1 A D C AC 2019-02-01
2 3 4 C A C CA 2019-03-01
2 3 4 C A C CD 2019-03-01
2 3 4 C A C BB 2019-03-01
2 3 4 C A C AA 2019-03-02
df = pd.DataFrame( {
   ''memberiD'': [1,1,2,2],''ticketid'': [1,3,3],''agegrp'': [1,4,4],''c1'': [''a'',''a'',''c'',''c''],''c2'': [''a'',''d'',''a''],''c3'': ['''','''',''d1'': [''aa'',''ab'',''ac'',''aa'',''ca'',''cd'',''bb'',''aa'']  
    } );

我想按 ticketid 分组,以便在一行中显示一个票证 ID。 对于每个ticketid,memberid 和agegrp 应该完全相同。 对于ticketid 中的c1,c2,c3,只需拉出出现频率最高的不同3 - 在平局的情况下,前3 中的任何一个都可以。 对于任何一个 ticketid 中的所有 d1,取出现频率最高的不同 3,并将它们插入列 d1,d2,d3 - 类似于 c1,c3 列:如果有平局,则前 3 个中的任何一个很好。 对于日期,只需选择任何票证 ID 显示的最早日期。

因此,结果数据框可能是:

memberid ticketid agegrp c1 c2 c3 d1 d2 d3 日期
1 1 1 A C AA AB AC 2019-01-01
1 2 1 A D C AA AC 2019-02-01
1 3 4 C A CA CD BB 2019-03-01

我尝试查看ticketid 上的索引,但我不确定如何使用该索引创建新列......尽管我不确定这种方法总体上是否正确。

解决方法

你想要这个吗?

from statistics import mode
from collections import Counter

final_df =df.groupby(''ticketid'',as_index=False).agg({''memberid'': mode,''c1'':mode,''c2'': mode,''c3'': mode,''date'': min,''d1'': list})
final_df[''d1'']  = final_df.d1.apply(lambda x: '',''.join(list(Counter(x))[:3]) if len(x) >= 3 else '',''.join(x))
final_df[[''d1'',''d2'',''d3'']] = final_df[''d1''].str.split('','',expand=True)

输出 -

   ticketid  memberid c1 c2   c3        date  d1  d2    d3
0         1         1  A  A  NaN  2019-01-01  AA  AB    AC
1         2         1  A  D    C  2019-02-01  AA  AC  None
2         3         2  C  A    C  2019-03-01  CA  CD    BB

今天的关于Python-通过熊猫DataFrame分组并选择最常用的值pandas dataframe 分组的分享已经结束,谢谢您的关注,如果想了解更多关于DataFrame分组和聚合、Python DaskDataframe按列分组、Python Dataframe 分组排序和 Modin、Python DataFrame 按列分组,同时创建新列的相关知识,请在本站进行查询。

本文标签: