16、python中dataframe的合并行/列、分组与聚合、行索引

这篇具有很好参考价值的文章主要介绍了16、python中dataframe的合并行/列、分组与聚合、行索引。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、合并行/列
合并行:t1.join(t2)相当于t1左关联t2,通过行索引关联,保留t1、t2全部字段,t1、t2列重复会报错
合并列:t1.merge(t2,left_on=column1,right_on=column2,how=‘inner’),t1连接t2,通过t1的field1与t2的field2字段连接,有相同的字段可以通过on指定,默认how为inner内连接取交集,outer为外连接取并集,left左连接,right右连接,NaN补全
2、分组与聚合
grouped=df.groupby(by=column1):获得元组(columns取值,分组后的dataframe)为元素的DataFrameGroupBy对象,可以循环遍历。

grouped[column2].count()或grouped.count()[column2]:对group by column1计数,不限制column2则对所有列计数。常用的统计函数有count(分组中非NA的数量)、sum(非NA的和)max、min、mean(非NA的均值)、median(非NA的中位数)、std(无偏标准差)、var(无偏方差)。

df.groupby(by=[df[col1],df[col2]])或df.groupby(by=[col1,col2]):对多列进行分组

df[col3].groupby(by=[df[col1],df[col2]]).count()或df.groupby(by=[col1,col2])[col3].count():结果为series,col1、col2组成复合索引,若先选列再分组,则by中必须加df。

df[[col3]].groupby(by=[df[col1],df[col2]]).count()或df.groupby(by=[col1,col2])[[col3]].count():结果为dataframe,col1、col2组成复合索引。
3、行索引
df.index:获取行索引,对于复合索引level为每一索引列的可能取值,name为索引列名称
df.index=[a,b]:设置行索引
df.reindex([i1,i2]):筛选行索引,不存在的行取值为空
df.set_index([col1,col2],drop=True)或df.set_index(col1,drop=True):将已有列设置为索引,drop为True会删列(默认)
df.index.unique():行索引可以重复

从复合索引取值:
s[外层索引][内层索引]:从series取值
df.loc[外层索引].loc[内层索引]:从dataframe取数
若要对内层索引取数可以通过df.swaplevel()交换内外层索引位置
dataframe[[col]]:获取单列的dataframe
4、操作案例1
对于这一组电影数据,如果我们想rating,runtime的分布情况,应该如何呈现数据?

import pandas as pd
import matplotlib.pyplot as plt
path='IMDB-Movie-Data.csv'
movie_data=pd.read_csv(path)
pd.set_option('display.max_columns',None)
print(movie_data.head(1))

Rating_max=movie_data['Rating'].max()###最大值
Rating_min=movie_data['Rating'].min()###最小值
bin_num=(Rating_max-Rating_min)//0.5
bin_list=[Rating_min+0.5*i for i in range(int(bin_num+2))]##分组
print(bin_list)
plt.figure(figsize=(20,8),dpi=80)
plt.hist(movie_data['Rating'],bin_list)
plt.xticks(bin_list)
plt.grid(alpha=0.4)
plt.show()
'''
![在这里插入图片描述](https://img-blog.csdnimg.cn/daa05beb233e4c88bbef89d660ad8fbd.png)

5、操作案例2
对于这一组电影数据,如果我们希望统计电影分类(genre)的情况,应该如何处理数据?
代码1

import pandas as pd
import numpy as np

path='IMDB-Movie-Data.csv'
movie_data=pd.read_csv(path)
pd.set_option('display.max_columns',None)
print(movie_data.head(1))
#获取分类的列表
Genre_series=movie_data["Genre"].str.split(',').tolist()
Genre_set=set([j for i in Genre_series for j in i ])
#构建全0数组
Genre_dataframe=pd.DataFrame(np.zeros((movie_data.shape[0],len(Genre_set))),columns=Genre_set)
###对每行进行迭代#给每个电影出现分类的位置赋值1 
for i in range(len(Genre_series)):
    Genre_dataframe.loc[i,Genre_series[i]]=1

print(Genre_dataframe.sum(axis=0))
print(type(Genre_dataframe.sum(axis=0)))###Series对象
Genre_count=Genre_dataframe.sum(axis=0)
print(Genre_count)
###排序
Genre_count=Genre_count.sort_values()
##获取索引
_x=Genre_count.index
##获取值
_y=Genre_count.values
plt.barh(_x,_y)
plt.show()

代码2

import pandas as pd
import numpy as np

path='IMDB-Movie-Data.csv'
movie_data=pd.read_csv(path)
pd.set_option('display.max_columns',None)
print(movie_data.head(1))
#获取分类的列表
Genre_series=movie_data["Genre"].str.split(',').tolist()
Genre_list=list(set([j for i in Genre_series for j in i ]))
#构建全0数组
Genre_dataframe=pd.DataFrame(np.zeros((movie_data.shape[0],len(Genre_list))),columns=Genre_list)
###对每列进行迭代 #给每个电影出现分类的位置赋值1
for i in Genre_list:
    Genre_dataframe[i][movie_data["Genre"].str.contains(i)]=1

print(Genre_dataframe.sum(axis=0))
print(type(Genre_dataframe.sum(axis=0)))###Series对象

Genre_count=Genre_dataframe.sum(axis=0)
print(Genre_count)
Genre_count=Genre_count.sort_values()
_x=Genre_count.index
_y=Genre_count.values
plt.barh(_x,_y)
plt.show()

5、操作案例3
现在我们有一组关于全球星巴克店铺的统计数据,如果我想知道美国的星巴克数量和中国的哪个多,或者我想知道中国每个省份星巴克的数量的情况,那么应该怎么办?

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
path='starbucks_store_worldwide.csv'
sbk_data=pd.read_csv(path)
pd.set_option('display.max_columns',None)
print(sbk_data.head(1))
print(sbk_data.info())
###根据国家分组,获得分组对象
sbk_groupby=sbk_data.groupby(by='Country')
###统计国家数量,为series类型
sbk_groupby_cnt=sbk_groupby['Brand'].count()
###展示数量前10国家的条形图
sbk_groupby_cnt_top10=sbk_groupby_cnt.sort_values()[:10]
plt.barh(sbk_groupby_cnt_top10.index,sbk_groupby_cnt_top10.values,color='orange')
plt.show()
###限制为中国,按省份分组
sbk_groupby_cn=sbk_data[sbk_data['Country']=='CN'].groupby(by='State/Province')
sbk_groupby_cnt_cn=sbk_groupby_cn['Brand'].count()
##中国城市的数量情况条形图
sbk_groupby_cn=sbk_data[sbk_data['Country']=='CN'].groupby(by='City')
sbk_groupby_cnt_cn=sbk_groupby_cn['Brand'].count().sort_values(ascending=False)[:25]
plt.figure(figsize=(20,12),dpi=80)
plt.barh(range(len(sbk_groupby_cnt_cn)),sbk_groupby_cnt_cn.values,color='orange')
myfont=font_manager.FontProperties(fname='C:/Windows/Fonts/msyh.ttc')
plt.yticks(range(len(sbk_groupby_cnt_cn)),sbk_groupby_cnt_cn.index,fontproperties=myfont)
plt.show()

##按多分类进行分组,返回有多层索引的series
grouped = sbk_data["Brand"].groupby(by=[sbk_data["Country"],sbk_data["State/Province"]]).count()
##按多分类进行分组,返回有多层索引的dataframe
grouped1 = sbk_data[["Brand"]].groupby(by=[sbk_data["Country"],sbk_data["State/Province"]]).count()

dataframe 合并行,python
dataframe 合并行,python
5、操作案例4
现在我们有全球排名靠前的10000本书的数据,那么请统计一下下面几个问题:
不同年份书的数量
不同年份书的平均评分情况文章来源地址https://www.toymoban.com/news/detail-720364.html

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.font_manager as font_manager
path='books.csv'
df=pd.read_csv(path)
pd.set_option('display.max_columns',None)
print(df.head(5))
print(df.info())
###筛选年份非空的记录
#df=df[df['original_publication_year'].notnull()]
df = df[pd.notnull(df["original_publication_year"])]
###不同年份书的数量
print(df['id'].groupby(by=df['original_publication_year']).count())
#不同年份书的平均评分情况
print(df['average_rating'].groupby(by=df['original_publication_year']).mean())

到了这里,关于16、python中dataframe的合并行/列、分组与聚合、行索引的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python 将excel 多行进行分组合并

    2024年02月14日
    浏览(42)
  • 【第三章 Python 机器学习入门之Series和DataFrame的创建、索引、切片、数据清洗、数据分析等】

    第一章 Python 机器学习入门之Pandas库的使用 第二章 Python 机器学习入门之NumPy库的使用 第四章 Python 机器学习入门之数据可视化 第五章 Python 机器学习入门之机器学习算法 第六章 Python 机器学习入门之实战项目 Series是一种一维数组,可以通过以下方式创建: 通过列表创建Ser

    2024年02月05日
    浏览(61)
  • 【100天精通Python】Day57:Python 数据分析_Pandas数据描述性统计,分组聚合,数据透视表和相关性分析

    目录 1 描述性统计(Descriptive Statistics) 2 数据分组和聚合 3 数据透视表 4 相关性分析

    2024年02月07日
    浏览(60)
  • group by聚合分组后如何获取分组数据

    之前用group by分组后一直困惑怎么把分组后的数据拿到,因为分组后同一组的只有一条数据,最后发现了 group_concat函数。记录一下,以后能用。 语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator \\\'分隔符\\\'] ) 说明:通过使用 distinct 可以排除重复值(去重

    2024年02月05日
    浏览(44)
  • pandas---Series与DataFrame索引、切片;多层索引、索引的堆叠

    1. Series的索引和切片 1.1 Series的索引: 可以使用中括号取单个索引(此时返回的是元素类型),或者中括号里一个列表取多个索引(此时 返回的仍然是一个Series类型)。分为显示索引和隐式索引: (1) 显式索引: 使用index中的元素作为索引值 使用.loc[ ] (2) 隐式索引: 使用整

    2024年02月09日
    浏览(47)
  • ES 聚合分组查询 语法

    ES 聚合分组查询的语法如下: 其中 index 是索引名称, size 设置为 0 意味着只返回聚合结果而不返回文档。 aggs 字段是聚合查询的核心部分,这里以 group_by_field 为例进行分组查询,其中 terms 指定了分组的字段名称。 这样的查询会返回按照 field_name 字段进行分组后每个分组的

    2024年02月11日
    浏览(39)
  • pandas中DataFrame数据合并、连接

    为解决数据冗余等问题,大量的数据会分开存放在不同的文件(表格)里。在数据处理时,经常会有不同表格的数据需要进行合并操作。可以通过pandas库的 merge函数 和 concat函数 来实现数据集的合并。 根据 一个或多个键 将不同DataFrame中的 行 连接起来。 说明:类似于关系数

    2024年02月15日
    浏览(44)
  • 数据分析 — Pandas 分组聚合

    pandas.apply() 是 Pandas 库中的一个函数,用于在 DataFrame 或 Series 上应用自定义函数。这个函数可以 沿着指定的轴(行或列)逐行或逐列地应用函数 ,从而实现对数据的定制化操作。 参数: func(必需):这是要应用的函数,可以是一个 Python 函数、lambda 函数或可调用对象。这

    2024年02月19日
    浏览(46)
  • 使用Elasticsearch进行分组聚合统计

    要使用Elasticsearch进行分组聚合统计,可以使用聚合(aggregation)功能。聚合操作允许您根据指定的条件对文档进行分组,并计算每个分组的聚合结果。 针对普通类型的字段,DSL构建语法: aggs: aggregations的别名,代表着分组 agg_name: 这个是自定义的名字,可以针对你自己

    2024年02月15日
    浏览(46)
  • 【MySQL】聚合函数与分组查询

    MySQL中的聚合函数用于对数据进行计算和统计,常见的聚合函数包括下面列举出来的聚合函数: 查看班级有多少同学 统计数学成绩有多少个 统计英语不及格的人数 查看数学成绩的总和 统计英语不及格的分数总和 统计不及格的英语的平均分不需要上面那么麻烦自己手动除:

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包