此处将为大家介绍关于Python-通过熊猫DataFrame分组并选择最常用的值的详细内容,并且为您解答有关pandasdataframe分组的相关问题,此外,我们还将为您介绍关于DataFrame分
此处将为大家介绍关于Python-通过熊猫DataFrame分组并选择最常用的值的详细内容,并且为您解答有关pandas dataframe 分组的相关问题,此外,我们还将为您介绍关于DataFrame分组和聚合、Python DaskDataframe按列分组、Python Dataframe 分组排序和 Modin、Python DataFrame 按列分组,同时创建新列的有用信息。
本文目录一览:- Python-通过熊猫DataFrame分组并选择最常用的值(pandas dataframe 分组)
- DataFrame分组和聚合
- Python DaskDataframe按列分组
- Python Dataframe 分组排序和 Modin
- Python 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分组和聚合
一、分组
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按列分组?
我正在尝试在简单的数据帧上计算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
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 按列分组,同时创建新列?
我在 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 按列分组,同时创建新列的相关知识,请在本站进行查询。
本文标签: