关于pandas:Python数据分析库介绍及引入惯例

文章和代码等曾经归档至【Github仓库:https://github.com/timerring/dive-into-AI】或者公众号【AIShareLab】回复 python数据分析 也可获取。python的毛病Python有一个叫做全局解释器锁(Global Interpreter Lock,GIL)的组件,这是一种避免解释器同时执行多条Python字节码指令的机制。这并不是说Python不能执行真正的多线程并行代码。例如,Python的C插件应用原生的C或C++的多线程,能够并行运行而不被GIL影响,只有它们不频繁地与Python对象交互。重要的python库NumPyNumPy(Numerical Python的简称)是Python科学计算的根底包。 疾速高效的多维数组对象ndarray。作为在算法和库之间传递数据的容器。对于数值型数据,NumPy数组在存储和解决数据时要比内置的Python数据结构高效得多。此外,由低级语言(比方C和Fortran)编写的库能够间接操作NumPy数组中的数据,无需进行任何数据复制工作。因而,许多Python的数值计算工具应用NumPy数组作为次要的数据结构。 pandaspandas提供了疾速便捷解决结构化数据的大量数据结构和函数。用得最多的pandas对象 DataFrame,它是一个面向列(column-oriented)的二维表构造Series,一个一维的标签化数组对象。pandas兼具NumPy高性能的数组计算性能以及电子表格和关系型数据库(如SQL)灵便的数据处理性能。它提供了简单精密的索引性能,能更加便捷地实现重塑、切片和切块、聚合以及选取数据子集等操作。 matplotlibmatplotlib是最风行的用于绘制图表和其它二维数据可视化的Python库。 SciPySciPy是一组专门解决科学计算中各种规范问题域的包的汇合,次要包含上面这些包: scipy.integrate:数值积分例程和微分方程求解器。scipy.linalg:扩大了由numpy.linalg提供的线性代数例程和矩阵合成性能。scipy.optimize:函数优化器(最小化器)以及根查找算法。scipy.signal:信号处理工具。scipy.sparse:稠密矩阵和稠密线性系统求解器。scipy.special:SPECFUN(这是一个实现了许多罕用数学函数(如伽玛函数)的Fortran库)的包装器。scipy.stats:规范间断和离散概率分布(如密度函数、采样器、间断散布函数等)、各种统计测验办法,以及更好的描述统计法。scikit-learn2010年诞生以来,scikit-learn成为了Python的通用机器学习工具包。 子模块包含: 分类:SVM、近邻、随机森林、逻辑回归等等。回归:Lasso、岭回归等等。聚类:k-均值、谱聚类等等。降维:PCA、特征选择、矩阵合成等等。选型:网格搜寻、穿插验证、度量。预处理:特征提取、标准化。statsmodels一个统计分析包,蕴含经典统计学和经济计量学的算法。 回归模型:线性回归,狭义线性模型,强壮线性模型,线性混合效应模型等等。方差分析(ANOVA)。工夫序列剖析:AR,ARMA,ARIMA,VAR和其它模型。非参数办法: 核密度估计,核回归。统计模型后果可视化。statsmodels更关注与统计推断,提供不确定预计和参数p-值。相同的,scikit-learn重视预测。 留神:当应用conda和pip二者安装包时,千万不要用pip降级conda的包,这样会导致环境产生问题。当应用Anaconda或Miniconda时,最好首先应用conda进行降级。常见的引入常规最佳引入形式如下: import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport seaborn as snsimport statsmodels as sm不倡议间接引入相似NumPy这种大型库的全部内容(from numpy import *)。

April 5, 2023 · 1 min · jiezi

关于pandas:pandas简单操作

因为须要用到pandas解决一些简略数据,记录一下应用的函数和思路: 1、pandas读取csv数据csv是gb2312编码,之前pandas始终没有代码提醒,不晓得怎么制订read_csv的编码方式,于是用open函数指定gb2312编码关上后,再把后果送入padnas,这样能解决不能解析的编码问题。 with open("金匮名医验案精选(900多则).csv","r", encoding="gb2312") as f: df = pd.read_csv(f)起初发现,能够间接在read_csv()中指定编码方式: df = pd.read_csv('xxy_yang.csv', encoding="gbk")2、pandas行列读取操作两个次要办法:依照index索引操作df.iloc(),依照行、列名进行操作的df.loc()对于这个一个数据表: import pandas as pddata = {'人名': ['小明', '小红', '张三', '李四'], '出世年份': ['2000', '2001', '2002', '2003'], '高考分数': ['630', '590', '600', '520'], '月薪': ['5200', '3900', '4500', '3500']}df = pd.DataFrame(data, columns=['人名', '出世年份', '高考分数', '月薪', '年终奖'], index=['one', 'two', 'three', 'four'])df['年终奖'] = ['9800', '9200', '9500', '9000']print("行索引:{}".format(list(df.index)))print("列索引:{}".format(list(df.columns)))print(df.index[1:3])print(df.columns[1])print(df.columns[1:3])print(df)运行后果为:依照index索引操作df.iloc()例如: df.iloc[1, 3] # 按坐标取(第二行第四列)df.iloc[[1], [3]] # 按坐标取(第二行第四列)df.iloc[:, 1] # 按地位取(任意行第二列)df.iloc[:, [1, 3]] # 按地位取不间断列数据(任意行第二列,第四列)df['人名']df.人名按行、列名操作如: print(df.loc['two'])print(df.loc['two', '人名'])print(df.loc['two':'three'])print(df.loc[['one', 'three']])print(df.loc[['one', 'three'], ['人名', '出世年份']])参考文献:pandas读取行列数据-具体介绍(间断&不间断)https://blog.csdn.net/in546/a... ...

December 22, 2022 · 1 min · jiezi

关于pandas:全自动化数据洞察数据分布对比可视化⛵

本文介绍如何应用 Pandas Profiling 的比拟报告性能,剖析两个数据集的散布差别,实现数据摸索剖析 (EDA) 的残缺流程,为后续剖析做筹备。 作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/article-detail/411 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容 引言 可视化是EDA的根底。当面对一个新的、未知的数据集时,视觉查看使咱们可能理解可用的信息,绘制一些无关数据的模式,并诊断出咱们可能须要解决的几个问题。在这方面,Pandas Profiling 始终是每个数据科学家工具箱中不可或缺的瑞士刀,能够帮忙咱们疾速生成数据摘要报告,包含数据概览、变量属性、数据分布、反复值和其余指标。它可能在可视化中出现这些信息,以便咱们更好地了解数据集。但如果咱们可能比拟两个数据集呢,有没有疾速的形式能够实现? 在本篇博客文章中,ShowMeAI将介绍如何利用 Pandas Profiling 的比拟报告性能来晋升数据摸索剖析 (EDA) 流程。咱们会介绍到如何应用 Pandas Profiling 比拟报告性能来比拟两个不同的数据集,这能够帮忙咱们更快地比照剖析数据,获取散布差别,为后续做筹备。 咱们本次用到的数据集是 Kaggle 的 HCC 数据集,大家能够通过 ShowMeAI 的百度网盘地址下载。 实战数据集下载(百度网盘):公众号『ShowMeAI钻研核心』回复『实战』,或者点击 这里 获取本文 [[42]Pandas Profiling:应用高级EDA工具比照剖析2个数据集](https://www.showmeai.tech/art...) 『HCC 数据集』 ⭐ ShowMeAI官网GitHub:https://github.com/ShowMeAI-Hub 对于更多数据自动化摸索工具,能够参考ShowMeAI过往文章 自动化数据分析 (EDA) 工具库大全。 全自动数据EDA工具 Pandas Profiling 性能回顾咱们回顾一下 Pandas Profiling 的装置与应用形式: # 通过pip装置pip install pandas-profiling==3.5.0如果咱们须要对 hcc 数据集进行剖析,参考代码如下: import pandas as pdfrom pandas_profiling import ProfileReport# Read the HCC Datasetdf = pd.read_csv("hcc.csv")# Produce the data profiling reportoriginal_report = ProfileReport(df, title='Original Data')original_report.to_file("original_report.html")咱们会失去十分清晰的数据分析后果报告,如下是报告的头部信息: ...

December 16, 2022 · 1 min · jiezi

关于pandas:Pandas中你一定要掌握的时间序列相关高级功能-⛵

本文解说Pandas工具库几个外围函数,能高效解决工夫序列:resample、shift、rolling。帮你得心应手解决工夫序列数据! 作者:韩信子@ShowMeAI 数据分析实战系列:https://www.showmeai.tech/tutorials/40 本文地址:https://www.showmeai.tech/article-detail/389 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容 Pandas 是大家都十分相熟的数据分析与解决工具库,对于结构化的业务数据,它能很不便地进行各种数据分析和数据操作。但咱们的数据中,常常会存在对应工夫的字段,很多业务数据也是工夫序组织,很多时候咱们不可避免地须要和工夫序列数据打交道。其实 Pandas 中有十分好的工夫序列解决办法,然而因为应用并不特地多,很多基础教程也会略过这一部分。 在本篇内容中,ShowMeAI对 Pandas 中解决工夫的外围函数办法进行解说。置信大家学习过后,会在解决工夫序列型数据时,更得心应手。 数据分析与解决的残缺常识技能,大家能够参考ShowMeAI制作的工具库速查表和教程进行学习和疾速应用。 数据迷信工具库速查表 | Pandas 速查表 图解数据分析:从入门到精通系列教程 工夫序列工夫序列是指将同一统计指标的数值按其产生的工夫先后顺序排列而成的数列。简略说来,工夫序列是随着工夫的推移记录某些取值,比如说商店一年的销售额(依照月份从1月到12月)。 Pandas 工夫序列解决咱们要理解的第一件事是如何在 Pandas 中创立一组日期。咱们能够应用date_range()创立任意数量的日期,函数须要你提供起始工夫、工夫长度和工夫距离。 # 构建时长为7的工夫序列pd.date_range("2022-01-01", periods=7, freq='D')# 输入# DatetimeIndex(['2022-01-01', '2022-01-02', '2022-01-03', '2022-01-04','2022-01-05', '2022-01-06', '2022-01-07'], dtype='datetime64[ns]', freq='D')留神到下面的频率可用freq来设置:最常见的是'W'每周,'D'是每天,'M'是月末,'MS'是月开始。 上面咱们创立一个蕴含日期和销售额的工夫序列数据,并将日期设置为索引。 # 设置随机种子,能够复现np.random.seed(12)# 构建数据集df = pd.DataFrame({ 'date': pd.date_range("2022-01-01", periods=180, freq='D'), 'sales': np.random.randint(1000, 10000, size=180)}) # 设置索引df = df.set_index('date') 留神,咱们要不便地对工夫序列进行解决,一个很重要的先序工作是将日期作为索引,咱们后面曾经实现这个工作了。 重采样Pandas 中很重要的一个外围性能是resample,从新采样,是对原样本重新处理的一个办法,是一个对惯例工夫序列数据从新采样和频率转换的便捷的办法。 办法的格局是: DataFrame.resample(rule, how=None, axis=0, fill_method=None, closed=None, label=None, convention='start',kind=None, loffset=None, limit=None, base=0)外围的参数rule是字符串,示意采样的频度。如下代码,在resample后接的mean是示意依照月度求均匀。 ...

November 28, 2022 · 1 min · jiezi

关于pandas:Pandas-数据显示不全快来了解这些设置技巧-⛵

作者:韩信子@ShowMeAI 数据分析实战系列:http://www.showmeai.tech/tutorials/40 本文地址:http://www.showmeai.tech/article-detail/285 申明:版权所有,转载请分割平台与作者并注明出处 珍藏ShowMeAI查看更多精彩内容 Pandas 数据显示的问题 咱们在利用 Python 进行数据分析开掘和机器学习时,最罕用的工具库就是 Pandas,它能够帮忙咱们快捷地进行数据处理和剖析。 对 Pandas 不相熟的同学,肯定要学习下这个宝藏工具库哦!ShowMeAI 给大家做了一个详尽的教程,能够在 Python 数据分析教程 中查看,咱们同时也制作了 Pandas速查表,不便大家疾速查找须要的性能。如果你喜爱跟着视频学习,那么举荐B站这个 疾速实战教程。但在应用 Pandas 时,咱们常常会遇到像上面这样一些问题,它很影响咱们查看数据理解详情。 长文本无奈显示全对于十分长的字段可能显示不全,如下图中,URL 被缩短显示。 迷信计数法显示失去细节Pandas 默认应用『迷信计数法』显示大浮点数,例如 1000000.5 显示为 1.000e+06 。对于数值较大的数字,就可能有如下的显示,这导致咱们看不到具体数值。 ![](https://p3-juejin.byteimg.com...e" width="30%" referrerpolicy="no-referrer"> 小数位精度不统一对于浮点型的字段列,Pandas 可能有不同的位精度。例如下图中,col_1 准确到小数点后一位,而 col_2 准确到小数点后三位。有时候精度的不统一可能会有信息的差别。 在本篇内容中,ShowMeAI 将介绍如何应用 Pandas 自定义设置来解决诸如上述的问题。次要的设置包含上面内容: 自定义要显示的行数自定义要显示的列数自定义列宽使浮点列之间的小数位精度保持一致禁用迷信记数法其余用法留神:以上设置仅更改数据的显示出现形式,理论并不会影响Dataframe存储的数据。 Pandas自定义显示设置 自定义显示行数打印大 Dataframe(行列数很多的数据)时,Pandas 默认显示前 5 行和后 5 行,如下图所示。 咱们能够通过设置显示选项 display.max_rows 来更改要显示的行数,比方咱们将其设置为4。 pd.set_option("diaply.max_row", 4)df 咱们能够应用重置选项 pd.reset_option("display.max_rows") 复原默认行数显示设置。 自定义显示列数同样的情理,咱们能够通过设置 display.max_columns 自定义输入 Dataframe 时要显示的列数。 ...

August 5, 2022 · 1 min · jiezi

关于pandas:Pandas-变量类型转换的-6-种方法

一、变量类型及转换对于变量的数据类型而言,Pandas除了数值型的int 和 float类型外,还有object ,category,bool,datetime类型。 另外,空值类型作为一种非凡类型,须要独自解决。 数据处理的过程中,常常须要将这些类型进行相互转换,上面介绍一些变量类型转换的罕用办法。 1、查问变量类型在数据处理的过程中,针对不同的数据类型会有不同的解决办法,比方数值型能够做加减乘除,然而字符型、工夫类型就须要其它解决办法。为此,咱们首先须要将各种数据类型进行辨别,而后再别离解决。 pandas中select_dtype函数能够特色变量进行疾速分类,具体用法如下: DataFrame.select_dtypes(include=None, exclude=None) include:列表,想要留下的数据类型,比方float64,int64,bool,object等exclude:列表,须要排除的数据类型,同上。df = pd.DataFrame({'a': [1, 2] * 3,                   'b': [True, False] * 3,                   'c': [1.0, 2.0] * 3,                   'd': ['a','b']*3})# 筛选float和int的数值类型变量num_list = df.select_dtypes(include=['float','int64']).columns.tolist()# 筛选ojbect字符型的数值类型变量obj_list = df.select_dtypes(include=['object']).columns.tolist()print(obj_list)print(num_list)>> ['d']>> ['a', 'c']include和exclude也能够组合应用筛选。 如果想要查看所有变量的数据类型,能够通过info疾速查看,如下: df.info()>><class 'pandas.core.frame.DataFrame'>RangeIndex: 6 entries, 0 to 5Data columns (total 4 columns): #   Column  Non-Null Count  Dtype  ---  ------  --------------  -----   0   a       6 non-null      int64   1   b       6 non-null      bool    2   c       6 non-null      float64 3   d       6 non-null      object dtypes: bool(1), float64(1), int64(1), object(1)memory usage: 278.0+ bytes2、转换数值类型数值类型包含int和float。 转换数据类型比拟通用的办法能够用astype进行转换。 pandas中有种十分便当的办法to_numeric()能够将其它数据类型转换为数值类型。 pandas.to_numeric(arg, errors='raise', downcast=None) arg:被转换的变量,格局能够是list,tuple,1-d array,Serieserrors:转换时遇到谬误的设置,ignore, raise, coerce,上面例子中具体解说downcast:转换类型降级设置,比方整型的有无符号signed/unsigned,和浮点float上面例子中,s是一列数据,具备多种数据类型,当初想把它转换为数值类型。 import pandas as pdimport numpy as nps = pd.Series(['boy', '1.0', '2019-01-02', 1, False, None, pd.Timestamp('2018-01-05')])# 默认错位格局为raise,遇到非数字字符串类型报错pd.to_numeric(s, errors='raise')  # 错位格局为ignore,只对数字字符串转换, 其余类型一律漠视不转换, 蕴含工夫类型pd.to_numeric(s, errors='ignore') # 将工夫字符串和bool类型强制转换为数字, 其余均转换为NaNpd.to_numeric(s, errors='coerce')   # downcast 能够进一步转化为int或者floatpd.to_numeric(s) # 默认float64类型pd.to_numeric(s, downcast='signed') # 转换为整型4、转换字符类型数字转字符类型非常简单,能够简略的应用str间接转换。 df = pd.DataFrame({'year': [2015, 2016],                   'month': [2, 3],                   'day': [4, 5]})df['month'] = df['month'].map(str) df.info()>><class 'pandas.core.frame.DataFrame'>RangeIndex: 2 entries, 0 to 1Data columns (total 3 columns): #   Column  Non-Null Count  Dtype ---  ------  --------------  -----  0   year    2 non-null      int64  1   month   2 non-null      object 2   day     2 non-null      int64 dtypes: int64(2), object(1)memory usage: 176.0+ bytes此外这里再延长一下,去掉字符类型的办法eval。 比方,当咱们遇到'[1,2,3]'这种状况的时候,咱们理论想获取外面的列表,然而当初却是个字符串类型,咱们能够应用eval函数将''这个外套间接去掉,去掉后主动转换成外面数据类型。 a = '[1,2,3]'type(a) >> streval(a)>> [1, 2, 3]5、转换工夫类型应用to_datetime函数将数据转换为日期类型,用法如下: pandas.to_datetime(arg, errors='raise', dayfirst=False, yearfirst=False, utc=None, box=True, format=None, exact=True, unit=None, infer_datetime_format=False, origin='unix') 参数比拟多,罕用的就是format,依照指定的字符串strftime格局解析日期,个别状况下该函数能够间接主动解析成日期类型。 # 对整个dataframe转换,将年月日几列主动合并为日期df = pd.DataFrame({'year': [2015, 2016],                   'month': [2, 3],                   'day': [4, 5]}) df>> year month day0 2015 2 41 2016 3 5pd.to_datetime(df)>>0   2015-02-041   2016-03-05dtype: datetime64[ns]# 对单列转换日期类型df1 = pd.DataFrame({'appl_tm':['20220401','20220402','20220403'],                    'appl_tm1':['2012.03.04','2021.09.04','2031.06.05']})>>df1    appl_tm     appl_tm10 20220401 2012.03.041 20220402 2021.09.042 20220403 2031.06.05 df1['appl_tm'] = pd.to_datetime(df1['appl_tm'])df1['appl_tm1'] = pd.to_datetime(df1['appl_tm1'], format='%Y.%m.%d')>>df1    appl_tm     appl_tm10 2022-04-01 2012-03-041 2022-04-02 2021-09-042 2022-04-03 2031-06-05转换为日期类型后,就能够对日期应用series.dt.办法进行更简单的筛选和查问了。 # 筛选2021年的日期,month和day也是同理df1['appl_tm1'].dt.year == 2021>>0    False1     True2    FalseName: appl_tm1, dtype: bool df1[df1['appl_tm1'].dt.year == 2021]>>    appl_tm     appl_tm11 2022-04-02 2021-09-046、转换category类型category类型在pandas中的出场率并不是很高,个别在不思考优化效率时,会用其它类型代替。但如果须要转换category类型,能够间接应用astype实现。 df = pd.DataFrame({'year': [2015, 2016],                   'month': [2, 3],                   'day': [4, 5]}) df['year'] = df['year'].astype('category')df.info()>><class 'pandas.core.frame.DataFrame'>RangeIndex: 2 entries, 0 to 1Data columns (total 3 columns): #   Column  Non-Null Count  Dtype   ---  ------  --------------  -----    0   year    2 non-null      category 1   month   2 non-null      int64    2   day     2 non-null      int64   dtypes: category(1), int64(2)memory usage: 258.0 byte对于category类型的具体应用办法,能够参考这篇文章:category分类变量的应用办法 7、智能类型转换convert_dtypes下面介绍的均为手动一对一的变量类型转换,pandas中还提供了一种智能转换的办法convert_dtypes,应用它能够无脑主动实现转换。 默认状况下,convert_dtypes将尝试将Series或DataFrame中的每个Series转换为反对的dtypes,它能够对Series和DataFrame都间接应用。 该办法的参数如下: infer_objects:默认为True,是否应将对象dtypes转换为最佳类型convert_string:默认为True,对象dtype是否应转换为StringDtype()convert_integer:默认为True,如果可能,是否能够转换为整数扩大类型convert_boolean :默认为True,对象dtype是否应转换为BooleanDtypes()convert_floating :默认为True,如果可能,是否能够转换为浮动扩大类型。如果convert_integer也为True,则如果能够将浮点数忠诚地转换为整数,则将优先思考整数dtype上面看一组示例。 通过后果能够看到,变量都是是创立时默认的类型。但其实变量是有整数、字符串、布尔的,其中有的还存在空值。 # 对整个dataframe间接转换>>> dfn = df.convert_dtypes()>>> dfn   a  b      c     d     e      f0  1  x   True     h    10   <NA>1  2  y  False     i  <NA>  100.52  3  z   <NA>  <NA>    20  200.0>>> dfn.dtypesa      Int32b     stringc    booleand     stringe      Int64f    Float64dtype: object疏忽了空值的影响,变量类型曾经主动转换为咱们想要的了。 对Series的转换也是一样的。上面的Seires中因为存在nan空值所以类型为object。 # Series 变量类型转换s = pd.Series(["a", "b", np.nan])>>> s0      a1      b2    NaNdtype: object# 通过convert_dtypes胜利转换为String>>> s.convert_dtypes()0       a1       b2    <NA>dtype: string如果将来减少了新类型,convert_dtypes办法也会同步更新,并反对新的变量类型。 以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料,内容笼罩Python电子书、教程、数据库编程、Django,爬虫,云计算等等。或是返回编程学习网,理解更多编程技术常识。

July 15, 2022 · 1 min · jiezi

关于pandas:4款Pandas自动数据分析神器

咱们做数据分析,在第一次拿到数据集的时候,个别会用统计学或可视化办法来理解原始数据。 理解列数、行数、取值散布、缺失值、列之间的相干关系等等,这个过程叫做 EDA(Exploratory Data Analysis,探索性数据分析)。 如果你当初做EDA还在用pandas一行行写代码,那么福音来了! 目前曾经有很多EDA工具能够主动产出根底的统计数据和图表,能为咱们节俭大量工夫。 本文会比照介绍 4 款罕用的EDA工具,最初一款绝了,齐全是摈弃代码的节奏。 正式介绍这些工具之前,先来加载数据集 import numpy as npimport pandas as pdiris = pd.read_csv('iris.csv')iris iris是上面用到的数据集,是一个150行 * 4列的 DataFrame。 1. PandasGUIPandasGUI提供数据预览、筛选、统计、多种图表展现以及数据转换。 # 装置# pip install pandasguifrom pandasgui import showshow(iris) PandasGUI操作界面 PandasGUI更偏重数据展现,提供了10多种图表,通过可视的形式配置。 但数据统计做的比较简单,没有提供缺失值、相关系数等指标,数据转换局部也只凋谢了一小部分接口。 2. Pandas ProfilingPandas Profiling 提供了整体数据详情、每列的详情、列之间的关图、列之间的相关系数。 # 装置:# pip install -U pandas-profiling# jupyter nbextension enable --py widgetsnbextensionfrom pandas_profiling import ProfileReportprofile = ProfileReport(iris, title='iris Pandas Profiling Report', explorative=True)profile Pandas Profiling操作界面 每列的详情包含:缺失值统计、去重计数、最值、平均值等统计指标和取值散布的柱状图。 列之间的相关系数反对Spearman、Pearson、Kendall 和 Phik 4 种相关系数算法。 与 PandasGUI 相同,Pandas Profiling没有丰盛的图表,但提供了十分多的统计指标以及相关系数。 3. SweetvizSweetviz与Pandas Profiling相似,提供了每列具体的统计指标、取值散布、缺失值统计以及列之间的相关系数。 # 装置# pip install sweetvizimport sweetviz as svsv_report = sv.analyze(iris)sv_report.show_html() Sweetviz操作界面 Sweetviz还有有一个十分好的个性是反对不同数据集的比照,如:训练数据集和测试数据集的比照。 Sweetviz数据集比照 蓝色和橙色代表不同的数据集,通过比照能够清晰发现数据集之前的差别。 4. dtale最初重磅介绍dtale,它不仅提供丰盛图表展现数据,还提供了很多交互式的接口,对数据进行操作、转换。 dtale操作界面 dtale的性能次要分为三局部:数据操作、数据可视化、高亮显示。 4.1 数据操作(Actions)dtale将pandas的函数包装成可视化接口,能够让咱们通过图形界面形式来操作数据。 # pip install dtaleimport dtaled = dtale.show(iris)d.open_browser() Actions 右半局部图是右边图的中文翻译,用的是 Chrome 主动翻译,有些不是很精确。 举一个数据操作的例子。 Summarize Data 上图是Actions菜单中Summarize Data的性能,它提供了对数据集汇总操作的接口。 上图咱们抉择依照species列分组,计算sepal_width列的平均值,同时能够看到左下角dtale曾经主动为该操作生成了pandas代码。 4.2 数据可视化(Visualize)提供比拟丰盛的图表,对每列数据详情、反复行、缺失值、相关系数进行统计和展现。 Visualize 举一个数据可视化的例子。 ...

July 14, 2022 · 1 min · jiezi

关于pandas:Pandas-GroupBy-深度总结

明天,咱们将探讨如何在 Python 的 Pandas 库中创立 GroupBy 对象以及该对象的工作原理。咱们将具体理解分组过程的每个步骤,能够将哪些办法利用于 GroupBy 对象上,以及咱们能够从中提取哪些有用信息 不要再张望了,一起学起来吧 应用 Groupby 三个步骤首先咱们要晓得,任何 groupby 过程都波及以下 3 个步骤的某种组合: 依据定义的规范将原始对象分成组对每个组利用某些函数整合后果让我先来大抵浏览下明天用到的测试数据集 import pandas as pdimport numpy as nppd.set_option('max_columns', None)df = pd.read_csv('complete.csv')df = df[['awardYear', 'category', 'prizeAmount', 'prizeAmountAdjusted', 'name', 'gender', 'birth_continent']]df.head()Output: awardYear category prizeAmount prizeAmountAdjusted name gender birth_continent0 2001 Economic Sciences 10000000 12295082 A. Michael Spence male North America1 1975 Physics 630000 3404179 Aage N. Bohr male Europe2 2004 Chemistry 10000000 11762861 Aaron Ciechanover male Asia3 1982 Chemistry 1150000 3102518 Aaron Klug male Europe4 1979 Physics 800000 2988048 Abdus Salam male Asia将原始对象拆分为组在这个阶段,咱们调用 pandas DataFrame.groupby() 函数。咱们应用它依据预约义的规范将数据分组,沿行(默认状况下,axis=0)或列(axis=1)。换句话说,此函数将标签映射到组的名称。 ...

June 29, 2022 · 10 min · jiezi

关于pandas:Pandas缺失值处理超强讲解

本篇详解pandas中缺失值(Missing data handling)解决罕用操作。 缺失值解决罕用于数据分析数据荡涤阶段; Pandas中将如下类型定义为缺失值: NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’, ‘NA’,‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’,None 1、pandas中缺失值注意事项pandas和numpy中任意两个缺失值不相等(np.nan != np.nan)下图中两个NaN不相等: In [224]: df1.iloc[3:,0].values#取出'one'列中的NaNOut[224]: array([nan])In [225]: df1.iloc[2:3,1].values#取出'two'列中的NaNOut[225]: array([nan])In [226]: df1.iloc[3:,0].values == df1.iloc[2:3,1].values#两个NaN值不相等Out[226]: array([False])pandas读取文件时那些值被视为缺失值NaN: ‘’, ‘#N/A’, ‘#N/A N/A’, ‘#NA’, ‘-1.#IND’, ‘-1.#QNAN’,‘-NaN’, ‘-nan’, ‘1.#IND’, ‘1.#QNAN’, ‘<NA>’, ‘N/A’, ‘NA’,‘NULL’, ‘NaN’, ‘n/a’, ‘nan’, ‘null’,None2、pandas缺失值操作pandas.DataFrame中判断那些值是缺失值:isna办法#定义一个试验DataFrameIn [47]: d = {'one': pd.Series([1., 2., 3.], index=['a', 'b', 'c']),'two': pd.Series([1., 2., 3., 4.], index=['a', 'b', 'c', 'd'])}In [48]: df = pd.DataFrame(d)In [49]: dfOut[49]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0In [120]: df.isna()#返回形态一样的bool值填充DataFrameOut[120]:     one    twoa  False  Falseb  False  Falsec  False  Falsed   True  Falsepandas.DataFrame中删除蕴含缺失值的行:dropna(axis=0)In [67]: dfOut[67]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0In [68]: df.dropna()#默认axis=0Out[68]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0pandas.DataFrame中删除蕴含缺失值的列:dropna(axis=1)In [72]: df.dropna(axis=1)Out[72]:   twoa  1.0b  2.0c  3.0d  4.0pandas.DataFrame中删除蕴含缺失值的列和行:dropna(how='any')In [97]: df['three']=np.nan#新增一列全为NaNIn [98]: dfOut[98]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  NaN  4.0    NaNIn [99]: df.dropna(how='any')Out[99]:Empty DataFrame#全删除了Columns: [one, two, three]Index: []pandas.DataFrame中删除全是缺失值的行:dropna(axis=0,how='all')In [101]: df.dropna(axis=0,how='all')Out[101]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  NaN  4.0    NaNpandas.DataFrame中删除全是缺失值的列:dropna(axis=1,how='all')In [102]: df.dropna(axis=1,how='all')Out[102]:   one  twoa  1.0  1.0b  2.0  2.0c  3.0  3.0d  NaN  4.0pandas.DataFrame中应用某个值填充缺失值:fillna(某个值)In [103]: df.fillna(666)#应用666填充Out[103]:     one  two  threea    1.0  1.0  666.0b    2.0  2.0  666.0c    3.0  3.0  666.0d  666.0  4.0  666.0pandas.DataFrame中应用前一列的值填充缺失值:fillna(axis=1,method='ffill')#后一列填充为fillna(axis=1,method=bfill')In [109]: df.fillna(axis=1,method='ffill')Out[109]:   one  two  threea  1.0  1.0    1.0b  2.0  2.0    2.0c  3.0  3.0    3.0d  NaN  4.0    4.0pandas.DataFrame中应用前一行的值填充缺失值:fillna(axis=0,method='ffill')#后一行填充为fillna(axis=1,method=bfill')In [110]: df.fillna(method='ffill')Out[110]:   one  two  threea  1.0  1.0    NaNb  2.0  2.0    NaNc  3.0  3.0    NaNd  3.0  4.0    NaNpandas.DataFrame中应用字典传值填充指定列的缺失值In [112]: df.fillna({'one':666})#填充one列的NaN值Out[112]:     one  two  threea    1.0  1.0    NaNb    2.0  2.0    NaNc    3.0  3.0    NaNd  666.0  4.0    NaNIn [113]: df.fillna({'three':666})Out[113]:   one  two  threea  1.0  1.0  666.0b  2.0  2.0  666.0c  3.0  3.0  666.0d  NaN  4.0  666.0以上就是本次分享的所有内容,如果你感觉文章还不错,欢送关注公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。或是返回编程学习网,理解更多编程技术常识。

June 29, 2022 · 1 min · jiezi

关于pandas:盘点66个Pandas函数轻松搞定数据清洗

明天咱们盘点66个Pandas函数合集,包含数据预览、数值数据操作、文本数据操作、行/列操作等等,波及“数据荡涤”的方方面面。 Pandas 是基于NumPy的一种工具,该工具是为解决数据分析工作而创立的。它提供了大量能使咱们疾速便捷地解决数据的函数和办法。 数据预览对于探索性数据分析来说,做数据分析前须要先看一下数据的总体详情。info()办法用来查看数据集信息,describe()办法将返回描述性统计信息,这两个函数大家应该都很相熟了。 describe办法默认只给出数值型变量的罕用统计量,要想对DataFrame中的每个变量进行汇总统计,能够将其中的参数include设为all。head()办法和tail() 办法则是别离显示数据集的前n和后n行数据。如果想要随机看N行的数据,能够应用sample()办法。 df.sample(3)输入: 如果要检查数据中各列的数据类型,能够应用.dtypes;如果想要值查看所有的列名,能够应用.columns。 df.columns输入: Index(['日期', '销量'], dtype='object')后面介绍的函数次要是读取数据集的数据信息,想要取得数据集的大小(长宽),能够应用.shape办法。 df.shape输入: (5, 2)另外,len()能够查看某列的行数,count()则能够查看该列值的无效个数,不蕴含有效值(Nan)。 缺失值与反复值Pandas荡涤数据时,判断缺失值个别采纳isnull()办法。此外,isnull().any()会判断哪些”列”存在缺失值,isnull().sum()用于将列中为空的个数统计进去。 df.isnull().any()输入: 日期 False销量 Truedtype: bool发现“销量”这列存在缺失值后,解决方法要么删除dropna() ,要么填充fillna()。 df.fillna(50)输入: Pandas荡涤数据时,判断反复值个别采纳duplicated()办法。如果想要间接删除反复值,能够应用drop_duplicates() 办法。此处较为常见,不再过多演示。 数值数据操作咱们在解决数据的时候,会遇到批量替换的状况,replace()是很好的解决办法。它既反对替换全副或者某一行,也反对替换指定的某个或指定的多个数值(用字典的模式),还能够应用正则表达式替换。 df["编号"].replace(r'BA.$', value='NEW', regex=True, inplace = True)输入: 在Pandas模块中, 调⽤rank()⽅法能够实现数据排名。 df["排名"] = df.rank(method="dense").astype("int")输入: rank()⽅法中的method参数,它有5个常⽤选项,能够帮忙咱们实现不同状况下的排名。 clip()办法,用于对超过或者低于某些数的数值进行截断[1],来保障数值在肯定范畴。比方每月的早退天数肯定是在0-31天之间。 df["早退天数"] = df["早退天数"].clip(0,31) 惟一值,unique()是以数组模式返回列的所有惟一值,而nunique()返回的是惟一值的个数。 df["gender"].unique()df["gender"].nunique()输入: 在数值数据操作中,apply()函数的性能是将一个自定义函数作用于DataFrame的行或者列;applymap()函数的性能是将自定义函数作用于DataFrame的所有元素。他们通常也与匿名函数lambda一起应用。 df["数量"].apply(lambda x: x+1)输入: 文本数据操作 之前咱们已经介绍过常常被人漠视的:Pandas 文本型数据处理。在对文本型的数据进行解决时,咱们会大量利用字符串的函数,来实现对一列文本数据进行操作[2]。 函数办法用法释义cat字符串的拼接contains判断某个字符串是否蕴含给定字符startswith/endswith判断某个字符串是否以...结尾/结尾get获取指定地位的字符串len计算字符串长度upper、lower英文大小写转换pad/center在字符串的右边、左边或左右两边增加给定字符repeat反复字符串几次slice_replace应用给定的字符串,替换指定的地位的字符split宰割字符串,将一列扩大为多列strip、rstrip、lstrip去除空白符、换行符findall利用正则表达式,去字符串中匹配,返回查找后果的列表extract、extractall承受正则表达式,抽取匹配的字符串(肯定要加上括号)举例: df.insert(2, "姓名",           df["姓"].str.cat(df["名"], sep=""))输入: df["手机号码"] = df["手机号码"].str.slice_replace(3,7,"*"*4)输入: df["地址"].str.extract("([\u4e00-\u9fa5]+)")  输入: 行/列操作数据荡涤时,会将带空值的行删除,此时DataFrame或Series类型的数据不再是间断的索引,能够应用reset_index()重置索引。 df.reset_index(drop=True)输入: rename()重命名用于更改行列的标签,即行列的索引。能够传入一个字典或者一个函数。在数据预处理中,比拟罕用。 df.rename(columns={'mark': 'sell'}, inplace=True)输入: 行列转置,咱们能够应用T属性取得转置后的DataFrame。 df.T输入: 删除行列,能够应用drop()。 df.drop(columns=["mark"])输入: 数据分析师在进行数据处理时常常会遇到长宽表互转的状况,这也是一道常见的数据分析面试题。 melt()办法能够将宽表转长表,即表格型数据转为树形数据。 df.melt(id_vars="姓名", var_name="科目", value_name="问题")输入: pivot()办法能够将长表转宽表,即树形数据转为表格型数据。 df.pivot(index='姓名', columns='科目', values='问题')输入: pivot()其实就是用 set_index()创立层次化索引,再用unstack()重塑 ...

June 15, 2022 · 1 min · jiezi

关于pandas:Pandas与SQL的超强结合爆赞

本文的所有演示数据,均是基于下方的四张表。对于下方各表之间的关联关系,我就不给大家阐明了,仔细观察字段名,应该就能够发现。 简介pandas中的DataFrame是一个二维表格,数据库中的表也是一个二维表格,因而在pandas中应用sql语句就显得瓜熟蒂落,pandasql应用SQLite作为其操作数据库,同时Python自带SQLite模块,不须要装置,便可间接应用。 这里有一点须要留神的是:应用pandasql读取DataFrame中日期格局的列,默认会读取年月日、时分秒,因而咱们要学会应用sqlite中的日期处理函数,不便咱们转换日期格局,下方提供sqlite中罕用函数大全,心愿对你有帮忙。 sqlite函数大全:http://suo.im/5DWraE 导入相干库: import pandas as pd  from pandasql import sqldf申明全局变量的2种形式在应用之前,申明该全局变量;一次性申明好全局变量;在应用之前,申明该全局变量df1 = pd.read_excel("student.xlsx")df2 = pd.read_excel("sc.xlsx")df3 = pd.read_excel("course.xlsx")df4 = pd.read_excel("teacher.xlsx")global df1global df2global df3global df4query1 = "select * from df1 limit 5"query2 = "select * from df2 limit 5"query3 = "select * from df3"query4 = "select * from df4"sqldf(query1)sqldf(query2)sqldf(query3)sqldf(query4)局部后果如下: 一次性申明好全局变量df1 = pd.read_excel("student.xlsx")  df2 = pd.read_excel("sc.xlsx")  df3 = pd.read_excel("course.xlsx")  df4 = pd.read_excel("teacher.xlsx")    pysqldf = lambda q: sqldf(q, globals())    query1 = "select * from df1 limit 5"  query2 = "select * from df2 limit 5"  query3 = "select * from df3"  query4 = "select * from df4"    sqldf(query1)  sqldf(query2)  sqldf(query3)  sqldf(query4)局部后果如下: 写几个简略的SQL语句查看sqlite的版本student = pd.read_excel("student.xlsx")  pysqldf = lambda q: sqldf(q, globals())  query1 = """      select sqlite_version(*)  """  pysqldf(query1)后果如下: where筛选student = pd.read_excel("student.xlsx")  pysqldf = lambda q: sqldf(q, globals())  query1 = """      select *       from student       where strftime('%Y-%m-%d',sage) = '1990-01-01'  """  pysqldf(query1)后果如下: 多表连贯student = pd.read_excel("student.xlsx")  sc = pd.read_excel("sc.xlsx")      pysqldf = lambda q: sqldf(q, globals())  query2 = """      select *      from student s      join sc on s.sid = sc.sid  """  pysqldf(query2)局部后果如下: 分组聚合student = pd.read_excel("student.xlsx")  sc = pd.read_excel("sc.xlsx")    pysqldf = lambda q: sqldf(q, globals())  query2 = """      select s.sname as 姓名,sum(sc.score) as 总分      from student s      join sc on s.sid = sc.sid      group by s.sname  """  pysqldf(query2)后果如下: union查问student = pd.read_excel("student.xlsx")  pysqldf = lambda q: sqldf(q, globals())  query1 = """      select *       from student       where strftime('%Y-%m',sage) = '1990-01'      union      select *       from student       where strftime('%Y-%m',sage) = '1990-12'  """  pysqldf(query1)后果如下: 以上就是本次分享的所有内容,想要理解更多 Python 常识欢送返回公众号:Python编程学习圈,每日干货分享,发送“J”还可支付大量学习材料。

June 13, 2022 · 1 min · jiezi

关于pandas:Pandas-第一轮零基础扫盲长期招收编程一对一教学VJiabcdefh

公众号原文首发:https://mp.weixin.qq.com/s/4RYfYc8_2vNxvq_B1bZrUA 为什么用 Pandas?你好,我是悦创。通过对 Numpy 的学习,咱们发现 Numpy 的性能的确弱小且易用。然而再弱小的工具也有其局限性。 例如 Numpy 是基于数组的运算,然而在理论工作中,咱们的数据元素会非常复杂,会同时蕴含文字格局、数字格局、工夫格局等,显然 Numpy就不实用了。 通常咱们说 Numpy 是基于数组格局构建的一个数组运算工具,而 Pandas 是基于 Numpy 构建的结构化数据处理工具。对 Pandas 来讲,数据格式失去了裁减,提供了工夫序列能力,并且可能同时包容多种数据格式,并且提供了灵便的缺失值解决工具,性能失去极大地拓展。 Pandas 罕用的数据结构有两种:Series 和 DataFrame 。其中 Series 是一个带有名称和索引的一维数组,而 DataFrame 则是用来示意多维的数组构造。 总结如下: 疾速高效的数据结构智能的数据处理能力不便的文件存取性能科研及商业利用宽泛对于 Pandas 有两种根底的数据结构,基本上咱们在应用的时候就是解决 Series 和 DataFrame。 Series:真正的数据是只有一列的,索引列咱们是不算进去的。索引数据A10B30C20D40DataFrame:好几个 Series 联合起来,也就是有好几列的数据联合起来。 电影评分评分人数0血观音7.9384781大佛普拉斯8.6581122华盛顿邮报8.2307733三块广告牌8.7250524装置 PandasWindows 零碎: pip install pandasMac 零碎: pip3 install pandas新建一个 Python 文件导入模块In [1]: import pandas as pdPandas 的根底类型1——Series创立一个 Series 类型的数据In [2]: data = pd.Series([1, 3, 5, 7])Series() 里间接填一个由数字组成的列表In [3]: list_data = [1, 3, 5, 7]In [4]: data = pd.Series(list_data) In [5]: dataOut[5]:0 11 32 53 7dtype: int64由后果咱们可知,右边把咱们的索引也列出来了,左边对应的数值也列出来了。底部通知你这个 Series 的数据类型 int64。「如果外面最低的数据类型是 float 那后果也会变成浮点数。」 ...

June 6, 2022 · 12 min · jiezi

关于pandas:你必须知道的Pandas-解析json数据的函数jsonnormalize

前言:Json数据介绍Json是一个利用及其宽泛的用来传输和替换数据的格局,它被利用在数据库中,也被用于API申请后果数据集中。 尽管它利用宽泛,机器很容易浏览且节俭空间,然而却不利于人来浏览和进一步做数据分析,因而通常状况下须要在获取json数据后,将其转化为表格格局的数据,以不便人来浏览和了解。 常见的Json数据格式有2种,均以键值对的模式存储数据,只是包装数据的办法有所差别: a. 个别JSON对象采纳{}将键值对数据括起来,有时候会有多层{} b. JSON对象列表采纳[]将JSON对象括起来,造成一个JSON对象的列表,JSON对象中同样会有多层{},也会有[]呈现,造成嵌套列表 这篇文章次要讲述pandas内置的Json数据转换方法json_normalize(),它能够对以上两种Json格局的数据进行解析,最终生成DataFrame,进而对数据进行更多操作。本文的次要解构如下: 解析一个最根本的Json- 解析一个带有多层数据的Json- 解析一个带有嵌套列表的Json- 当Key不存在时如何疏忽零碎报错- 应用sep参数为嵌套Json的Key设置分隔符- 为嵌套列表数据和元数据增加前缀- 通过URL获取Json数据并进行解析- 探索:解析带有多个嵌套列表的Jsonjson_normalize()函数参数解说 在进行代码演示前先导入相应依赖库,未装置pandas库的请自行装置(此代码在Jupyter Notebook环境中运行)。 from pandas import json_normalizeimport pandas as pd1. 解析一个最根本的Jsona. 解析个别Json对象a_dict = {<!-- -->    'school': 'ABC primary school',    'location': 'London',    'ranking': 2}pd.json_normalize(a_dict)输入后果为: b. 解析一个Json对象列表json_list = [    {<!-- -->'class': 'Year 1', 'student number': 20, 'room': 'Yellow'},    {<!-- -->'class': 'Year 2', 'student number': 25, 'room': 'Blue'}]pd.json_normalize(json_list)输入后果为: 2. 解析一个带有多层数据的Jsona. 解析一个有多层数据的Json对象json_obj = {<!-- -->    'school': 'ABC primary school',    'location': 'London',    'ranking': 2,    'info': {<!-- -->        'president': 'John Kasich',        'contacts': {<!-- -->            'email': {<!-- -->                'admission': 'admission@abc.com',                'general': 'info@abc.com'            },            'tel': '123456789',        }    }}pd.json_normalize(json_obj)输入后果为: 多层key之间应用点隔开,展现了所有的数据,这曾经解析了3层,上述写法和pd.json_normalize(json_obj, max_level=3)等价。 如果设置max_level=1,则输入后果为下图所示,contacts局部的数据会集成了一列 如果设置max_level=2,则输入后果为下图所示,contacts 下的email局部的数据会集成了一列 b. 解析一个有多层数据的Json对象列表json_list = [    {<!-- -->        'class': 'Year 1',        'student count': 20,        'room': 'Yellow',        'info': {<!-- -->            'teachers': {<!-- -->                'math': 'Rick Scott',                'physics': 'Elon Mask'            }        }    },    {<!-- -->        'class': 'Year 2',        'student count': 25,        'room': 'Blue',        'info': {<!-- -->            'teachers': {<!-- -->                'math': 'Alan Turing',                'physics': 'Albert Einstein'            }        }    }]pd.json_normalize(json_list)输入后果为: 若别离将max_level设置为2和3,则输入后果应别离是什么?请自行尝试~ 3. 解析一个带有嵌套列表的Jsonjson_obj = {<!-- -->    'school': 'ABC primary school',    'location': 'London',    'ranking': 2,    'info': {<!-- -->        'president': 'John Kasich',        'contacts': {<!-- -->            'email': {<!-- -->                'admission': 'admission@abc.com',                'general': 'info@abc.com'            },            'tel': '123456789',        }    },    'students': [        {<!-- -->'name': 'Tom'},        {<!-- -->'name': 'James'},        {<!-- -->'name': 'Jacqueline'}    ],}pd.json_normalize(json_obj)此例中students键对应的值是一个列表,应用[]括起来。间接采纳上述的办法进行解析,则失去的后果如下: students局部的数据并未被胜利解析,此时能够为record_path设置值即可,调用形式为pd.json_normalize(json_obj, record_path='students'),在此调用形式下,失去的后果只蕴含了name局部的数据。 若要减少其余字段的信息,则需为meta参数赋值,例如下述调用形式下,失去的后果如下: pd.json_normalize(json_obj, record_path='students', meta=['school', 'location', ['info', 'contacts', 'tel'], ['info', 'contacts', 'email', 'general']]) 4. 当Key不存在时如何疏忽零碎报错data = [    {<!-- -->         'class': 'Year 1',         'student count': 20,         'room': 'Yellow',        'info': {<!-- -->            'teachers': {<!-- -->                 'math': 'Rick Scott',                 'physics': 'Elon Mask',            }        },        'students': [            {<!-- --> 'name': 'Tom', 'sex': 'M' },            {<!-- --> 'name': 'James', 'sex': 'M' },        ]    },    {<!-- -->         'class': 'Year 2',         'student count': 25,         'room': 'Blue',        'info': {<!-- -->            'teachers': {<!-- -->                  # no math teacher                 'physics': 'Albert Einstein'            }        },        'students': [            {<!-- --> 'name': 'Tony', 'sex': 'M' },            {<!-- --> 'name': 'Jacqueline', 'sex': 'F' },        ]    },]pd.json_normalize(    data,     record_path =['students'],     meta=['class', 'room', ['info', 'teachers', 'math']])在class等于Year 2的Json对象中,teachers下的math键不存在,间接运行上述代码会报以下谬误,提醒math键并不总是存在,且给出了相应倡议:Try running with errors='ignore'。 增加errors条件后,从新运行得出的后果如下图所示,没有math键的局部应用NaN进行了填补。 pd.json_normalize(    data,     record_path =['students'],     meta=['class', 'room', ['info', 'teachers', 'math']],    errors='ignore') 5. 应用sep参数为嵌套Json的Key设置分隔符在2.a的案例中,能够留神到输入后果的具备多层key的数据列题目是采纳.对多层key进行分隔的,能够为sep赋值以更改分隔符。 json_obj = {<!-- -->    'school': 'ABC primary school',    'location': 'London',    'ranking': 2,    'info': {<!-- -->        'president': 'John Kasich',        'contacts': {<!-- -->          'email': {<!-- -->              'admission': 'admission@abc.com',              'general': 'info@abc.com'          },          'tel': '123456789',      }    }}pd.json_normalize(json_obj, sep='-&gt;')输入后果为: 6. 为嵌套列表数据和元数据增加前缀在3例的输入后果中,各列名均无前缀,例如name这一列不知是元数据解析失去的数据,还是通过student嵌套列表的的出的数据,因而为record_prefix和meta_prefix参数别离赋值,即可为输入后果增加相应前缀。 json_obj = {<!-- -->    'school': 'ABC primary school',    'location': 'London',    'ranking': 2,    'info': {<!-- -->        'president': 'John Kasich',        'contacts': {<!-- -->            'email': {<!-- -->                'admission': 'admission@abc.com',                'general': 'info@abc.com'            },            'tel': '123456789',        }    },    'students': [        {<!-- -->'name': 'Tom'},        {<!-- -->'name': 'James'},        {<!-- -->'name': 'Jacqueline'}    ],}pd.json_normalize(json_obj, record_path='students',                  meta=['school', 'location', ['info', 'contacts', 'tel'], ['info', 'contacts', 'email', 'general']],                  record_prefix='students-&gt;',                  meta_prefix='meta-&gt;',                  sep='-&gt;')本例中,为嵌套列表数据增加students-&gt;前缀,为元数据增加meta-&gt;前缀,将嵌套key之间的分隔符批改为-&gt;,输入后果为: 7. 通过URL获取Json数据并进行解析通过URL获取数据须要用到requests库,请自行装置相应库。 import requestsfrom pandas import json_normalize# 通过天气API,获取深圳近7天的天气url = 'https://tianqiapi.com/free/week'# 传入url,并设定好相应的paramsr = requests.get(url, params={<!-- -->"appid":"59257444", "appsecret":"uULlTGV9 ", 'city':'深圳'})# 将获取到的值转换为json对象result = r.json()df = json_normalize(result, meta=['city', 'cityid', 'update_time'], record_path=['data'])dfresult的后果如下所示,其中data为一个嵌套列表: {<!-- -->'cityid': '101280601', 'city': '深圳', 'update_time': '2021-08-09 06:39:49', 'data': [{<!-- -->'date': '2021-08-09',   'wea': '中雨转雷阵雨',   'wea_img': 'yu',   'tem_day': '32',   'tem_night': '26',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-10',   'wea': '雷阵雨',   'wea_img': 'yu',   'tem_day': '32',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-11',   'wea': '雷阵雨',   'wea_img': 'yu',   'tem_day': '31',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-12',   'wea': '多云',   'wea_img': 'yun',   'tem_day': '33',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-13',   'wea': '多云',   'wea_img': 'yun',   'tem_day': '33',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-14',   'wea': '多云',   'wea_img': 'yun',   'tem_day': '32',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'},  {<!-- -->'date': '2021-08-15',   'wea': '多云',   'wea_img': 'yun',   'tem_day': '32',   'tem_night': '27',   'win': '无继续风向',   'win_speed': '&lt;3级'}]}解析后的输入后果为: ...

May 30, 2022 · 1 min · jiezi

关于pandas:数据分析实际案例之pandas在泰坦尼特号乘客数据中的使用

简介1912年4月15日,号称永不沉没的泰坦尼克号因为和冰山相撞沉没了。因为没有足够的救济设施,2224个乘客中有1502个乘客不幸遇难。事变曾经产生了,然而咱们能够从泰坦尼克号中的历史数据中发现一些数据法则吗?明天本文将会率领大家灵便的应用pandas来进行数据分析。 泰坦尼特号乘客数据咱们从kaggle官网中下载了局部泰坦尼特号的乘客数据,次要蕴含上面几个字段: 变量名含意取值survival是否生还0 = No, 1 = Yespclass船票的级别1 = 1st, 2 = 2nd, 3 = 3rdsex性别 Age年龄 sibsp配偶信息 parch父母或者子女信息 ticket船票编码 fare船费 cabin客舱编号 embarked登录的港口C = Cherbourg, Q = Queenstown, S = Southampton下载下来的文件是一个csv文件。接下来咱们来看一下怎么应用pandas来对其进行数据分析。 应用pandas对数据进行剖析引入依赖包本文次要应用pandas和matplotlib,所以须要首先进行上面的通用设置: from numpy.random import randnimport numpy as npnp.random.seed(123)import osimport matplotlib.pyplot as pltimport pandas as pdplt.rc('figure', figsize=(10, 6))np.set_printoptions(precision=4)pd.options.display.max_rows = 20读取和剖析数据pandas提供了一个read_csv办法能够很不便的读取一个csv数据,并将其转换为DataFrame: path = '../data/titanic.csv'df = pd.read_csv(path)df咱们看下读入的数据: PassengerIdPclassNameSexAgeSibSpParchTicketFareCabinEmbarked 08923Kelly, Mr. Jamesmale34.5003309117.8292NaNQ18933Wilkes, Mrs. James (Ellen Needs)female47.0103632727.0000NaNS28942Myles, Mr. Thomas Francismale62.0002402769.6875NaNQ38953Wirz, Mr. Albertmale27.0003151548.6625NaNS48963Hirvonen, Mrs. Alexander (Helga E Lindqvist)female22.011310129812.2875NaNS58973Svensson, Mr. Johan Cervinmale14.00075389.2250NaNS68983Connolly, Miss. Katefemale30.0003309727.6292NaNQ78992Caldwell, Mr. Albert Francismale26.01124873829.0000NaNS89003Abrahim, Mrs. Joseph (Sophie Halaut Easu)female18.00026577.2292NaNC99013Davies, Mr. John Samuelmale21.020A/4 4887124.1500NaNS....................................40813003Riordan, Miss. Johanna Hannah""femaleNaN003349157.7208NaNQ40913013Peacock, Miss. Treasteallfemale3.011SOTON/O.Q. 310131513.7750NaNS41013023Naughton, Miss. HannahfemaleNaN003652377.7500NaNQ41113031Minahan, Mrs. William Edward (Lillian E Thorpe)female37.0101992890.0000C78Q41213043Henriksson, Miss. Jenny Lovisafemale28.0003470867.7750NaNS41313053Spector, Mr. WoolfmaleNaN00A.5. 32368.0500NaNS41413061Oliva y Ocana, Dona. Ferminafemale39.000PC 17758108.9000C105C41513073Saether, Mr. Simon Sivertsenmale38.500SOTON/O.Q. 31012627.2500NaNS41613083Ware, Mr. FrederickmaleNaN003593098.0500NaNS41713093Peter, Master. Michael JmaleNaN11266822.3583NaNC418 rows × 11 columns ...

February 24, 2022 · 3 min · jiezi

关于pandas:精选3种张炫酷的动态交互式图表Pandas一键生成通俗易懂

大家好! 明天来讲一下如何用一行代码在DataFrame数据集当中生成炫酷的动静交互式的图表,咱们先来介绍一下这次须要用到的模块cufflinks 模块的装置波及到装置,间接pip install即可 pip install cufflinks导入模块,并查看相干的配置咱们导入该模块,看一下目前的版本是在多少 cf.__version__output '0.17.3'目前该模块的版本曾经到了0.17.3,也是最新的版本,而后咱们最新版本反对能够绘制的图表有哪些 cf.help()output Use 'cufflinks.help(figure)' to see the list of available parameters for the given figure.Use 'DataFrame.iplot(kind=figure)' to plot the respective figureFigures: bar box bubble bubble3d candle choroplet distplot .......从下面的输入咱们能够看到,绘制图表大抵的语法是df.iplot(kind=图表名称)而如何咱们想要查看某个特定图表绘制时候的参数,例如柱状图bar参数有哪些,能够这么做 cf.help('bar')柱状图咱们先来看一下直方图图表的绘制,首先来创立一个数据集用于图表的绘制 df2 = pd.DataFrame({'Category':['A','B','C','D'],                    'Values':[95,56,70,85]})df2output   Category  Values0        A      951        B      562        C      703        D      85而后咱们来绘制直方图 df2.iplot(kind='bar',x='Category',y='Values',          xTitle = "Category",yTitle = "Values",          title = "直方图")output 其中的x参数下面填的是x轴下面对应的变量名,而y参数填的是y轴下面对应的变量名,咱们能够将绘制的图表以png的格局下载下来, 同时咱们也还能够对绘制的图表放大查看, 咱们再来看一下上面这组数据 df = pd.DataFrame(np.random.randn(100,4),columns='A B C D'.split())df.head()output           A         B         C         D0  0.612403 -0.029236 -0.595502  0.0277221  1.167609  1.528045 -0.498168 -0.2210602 -1.338883 -0.732692  0.935410  0.3387403  1.662209  0.269750 -1.026117 -0.8584724  1.387077 -0.839192 -0.562382 -0.989672咱们来绘制直方图的图表 df.head(10).iplot('bar')output 咱们也能够来绘制“重叠式”的直方图 df.head(10).iplot(kind='bar',barmode='stack')output 那么同样地,咱们也能够将直方图横过去来绘制 df.head(10).iplot(kind='barh',barmode='stack')output 折线图上面咱们来看一下折线图的绘制,咱们首先针对下面的df数据集各列做一个累加 df3 = df.cumsum()而后咱们来绘制折线图 df3.iplot()output 当然你也能够筛选出当中的几列而后来进行绘制,成果如下 df3[["A", "B"]].iplot()output 咱们也能够给折线图画一条拟合其走势的直线, df3['A'].iplot(bestfit = True,bestfit_colors=['pink'])output 这里咱们着重来介绍一个iplot()办法外面罕用的参数 kind:图表类型,默认的是scatter,散点类型,可供选择的类型还有bar(直方图)、box(箱型图)、heatmap(热力求)等等theme: 布局主题,能够通过cf.getThemes()来查看次要有哪些title: 图表的题目xTitle/yTitle: x或者y轴下面的轴名colors: 绘制图表时候的色彩subplots: 布尔值,绘制子图时候须要用到,默认为Falsemode: 字符串,绘图的模式,能够有lines、markers,也还有lines+markers和lines+text等模式size: 针对于散点图而言,次要用来调整散点的大小shape: 在绘制子图时候各个图的布局bargap: 直方图当中柱子之间的间隔barmode : 直方图的状态,stack(重叠式)、group(簇状)、overlay(笼罩)面积图从折线图到面积图的转变十分的简略,只须要将参数fill设置为True即可,代码如下 df3.iplot(fill = True)output

December 30, 2021 · 1 min · jiezi

关于pandas:Pandas学习笔记02处理数据实用操作

作者:幻好 起源:恒生LIGHT云社区 Pandas 是一个 Python 软件库,它提供了大量能使咱们疾速便捷地解决数据的函数和办法。在本文将次要介绍 Pandas 的实用数据处理操作。 系列文章: 【Pandas学习笔记01】弱小的剖析结构化数据的工具集 概述Pandas 是基于 NumPy 构建的库,在数据处理方面能够把它了解为 NumPy 加强版,同时 Pandas 也是一项开源我的项目。它基于 Cython,因而读取与解决数据十分快,并且还能轻松解决浮点数据中的缺失数据(示意为 NaN)以及非浮点数据。在本文中,根本数据集操作次要介绍了 CSV 与 Excel 的读写办法,根本数据处理次要介绍了缺失值及特色抽取,最初的 DataFrame 操作则次要介绍了函数和排序等办法。 数据集根底操作读取 CSV 格式文件中的数据集import pandas as pd# 形式1 df1 = pd.read_csv(“file.csv”)# 形式2df2 = pd.DataFrame.from_csv(“file.csv”)读取 Excel 格式文件中的数据集import pandas as pddf = pd.read_excel("file.xlsx")获取根本的数据集特色信息df.info()查问数据集根本统计信息print(df.describe())查问所有列的题目名称print(df.columns)应用 DataFrame 对象将数据写入 CSV 文件# 采纳逗号作为分隔符,且不带索引df.to_csv("data.csv", sep=",", index=False)数据集的解决首先定义一个 DataFrame 数据集: import pandas as pddf = pd.DataFrame(data = [['java',1],['python',2],['golang','3']],index = [1,2,3],columns = ['name','rank'])print(df)打印数据集: name rank1 java 12 python 23 golang 3查问数据操作应用df.loc[index, column] 对具体的行和列的数据进行查问# 查问指定行和列的数据df.loc[0,'name']#选取第0行到第1行,name列和rank列的数据df.loc[[0,1],['name','age']]#选取name列是M,name和rank列的数据df.loc[df['name']=='java',['name','rank']] 通过df['column_name'] 或df[row_start_index, row_end_index] 对整列或肯定范畴的行数据进行查问# 选取单列或多列df['name']df[['name','rank']] #第0行及之后的行df[0:] # 第1行到第2行(不含第3行)df[1:3] # 最初一行df[-1:] 减少数据操作向数据集中减少列数据:# 在第0列,加上 column 名称为 user_num,值为 user_num 的值user_num = ['100','89','70']df.insert(0,'user_num',user_num) # 默认在df最初一列加上column名称为 application,值为 application 的数据application = ['Web','AI','server']df['application'] = application向数据集中减少行数据:# 若df中没有index为“10”的这一行数据,则新增# 若df中曾经有index为“10”的这一行数据,则更新数据。df.loc[10] = ['php',10]# 向df中追加新的数据new_df = pd.DataFrame(index = True,columns = ['name','rank'])df = df.append(new_df,ignore_index = True) 批改数据操作批改列题目#只把’user_num’改为’users’,要把所有的列全写上,否则报错。df.columns = ['name', 'rank', 'users'] #只批改name,inplace若为True,间接批改df,否则,不批改df,只是返回一个批改后的数据。df.rename(columns = {'name':'Name'}, inplace = True) 批改数值# 批改index为‘0’,column为‘name’的那一个值为Cdf.loc[0, 'name'] = 'C' # 批改index为‘0’的那一行的所有值df.loc[0] = ['java', 1, '1000'] # 批改index为‘0’,column为‘name’的那一个值为Javadf.loc[0,['name','rank']] = ['Java'] # 替换缺失数据df.replace(to_replace=None, value=None)删除数据操作删除行数据# 删除index值为2和3的两行df.drop([2,3],axis = 0,inplace = False)删除列数据# 删除 name 列df.drop(['name'],axis = 1,inplace = False) del df['name'] # 删除 name 列,操作后,将删除的返回给new_dfnew_df = df.pop('age') 总结本文次要介绍 Pandas 工具集的实用操作,可能帮忙咱们解决日常数据处理的根本问题,后续将持续分享高阶技巧,敬请期待。 ...

November 26, 2021 · 1 min · jiezi

关于pandas:Pandas高级教程之时间处理

简介工夫应该是在数据处理中常常会用到的一种数据类型,除了Numpy中datetime64 和 timedelta64 这两种数据类型之外,pandas 还整合了其余python库比方 scikits.timeseries 中的性能。 工夫分类pandas中有四种工夫类型: Date times : 日期和工夫,能够带时区。和规范库中的 datetime.datetime 相似。Time deltas: 相对持续时间,和 规范库中的 datetime.timedelta 相似。Time spans: 由工夫点及其关联的频率定义的时间跨度。Date offsets:基于日历计算的工夫 和 dateutil.relativedelta.relativedelta 相似。咱们用一张表来示意: 类型标量class数组classpandas数据类型次要创立办法Date timesTimestampDatetimeIndexdatetime64[ns] or datetime64[ns, tz]to_datetime or date_rangeTime deltasTimedeltaTimedeltaIndextimedelta64[ns]to_timedelta or timedelta_rangeTime spansPeriodPeriodIndexperiod[freq]Period or period_rangeDate offsetsDateOffsetNoneNoneDateOffset看一个应用的例子: In [19]: pd.Series(range(3), index=pd.date_range("2000", freq="D", periods=3))Out[19]: 2000-01-01 02000-01-02 12000-01-03 2Freq: D, dtype: int64看一下下面数据类型的空值: In [24]: pd.Timestamp(pd.NaT)Out[24]: NaTIn [25]: pd.Timedelta(pd.NaT)Out[25]: NaTIn [26]: pd.Period(pd.NaT)Out[26]: NaT# Equality acts as np.nan wouldIn [27]: pd.NaT == pd.NaTOut[27]: FalseTimestampTimestamp 是最根底的工夫类型,咱们能够这样创立: ...

October 11, 2021 · 5 min · jiezi

关于pandas:python爬虫-Day-7

第一次补课--第七节课后csv写入与读取1. 写入文件(1)通过创立writer对象,应用列表的形式,次要用到两个办法:一个是writerow,每次写入一行;一个是writerows,每次写入多行,只需写入一次 import csvimport pandas as pd# 第一种写入形式 writerowperson =[ ('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),]# 表头header = ('name', 'age', 'height')# w-->写 如果office关上乱码了 须要改成utf-8-sig newline-->换行with open('person.csv', 'w', encoding='utf-8', newline='') as file_obj: writer = csv.writer(file_obj) writer.writerow(header) # 把表头写进去 for i in person: writer.writerow(i) # 把内容写进去# 第二种写入形式 writerowsperson =[ ('你猜', 18, 180), ('不猜', 20, 182), ('我猜', 22, 184),]header = ('name', 'age', 'height')with open('person2.csv', 'w', encoding='utf-8', newline='') as file_obj: writer = csv.writer(file_obj) writer.writerow(header) # 把表头写进去 writer.writerows(person) # 把内容写进去(2)通过创立DictWriter对象 即应用字典的形式写入数据 ...

August 30, 2021 · 2 min · jiezi

关于pandas:Pandas高级教程之统计方法

简介数据分析中常常会用到很多统计类的办法,本文将会介绍Pandas中应用到的统计办法。 变动百分百Series和DF都有一个pct_change() 办法用来计算数据变动的百分比。这个办法在填充NaN值的时候特地有用。 ser = pd.Series(np.random.randn(8))ser.pct_change()Out[45]: 0 NaN1 -1.2647162 4.1250063 -1.1590924 -0.0912925 4.8377526 -1.1821467 -8.721482dtype: float64serOut[46]: 0 -0.9505151 0.2516172 1.2895373 -0.2051554 -0.1864265 -1.0883106 0.1982317 -1.530635dtype: float64pct_change还有个periods参数,能够指定计算百分比的periods,也就是隔多少个元素来计算: In [3]: df = pd.DataFrame(np.random.randn(10, 4))In [4]: df.pct_change(periods=3)Out[4]: 0 1 2 30 NaN NaN NaN NaN1 NaN NaN NaN NaN2 NaN NaN NaN NaN3 -0.218320 -1.054001 1.987147 -0.5101834 -0.439121 -1.816454 0.649715 -4.8228095 -0.127833 -3.042065 -5.866604 -1.7769776 -2.596833 -1.959538 -2.111697 -3.7989007 -0.117826 -2.169058 0.036094 -0.0676968 2.492606 -1.357320 -1.205802 -1.5586979 -1.012977 2.324558 -1.003744 -0.371806Covariance协方差Series.cov() 用来计算两个Series的协方差,会疏忽掉NaN的数据。 ...

July 8, 2021 · 4 min · jiezi

关于pandas:Pandas高级教程之plot画图详解

简介python中matplotlib是十分重要并且不便的图形化工具,应用matplotlib能够可视化的进行数据分析,明天本文将会具体解说Pandas中的matplotlib利用。 根底画图要想应用matplotlib,咱们须要援用它: In [1]: import matplotlib.pyplot as plt如果咱们要从2020年1月1日开始,随机生成365天的数据,而后作图示意应该这样写: ts = pd.Series(np.random.randn(365), index=pd.date_range("1/1/2020", periods=365))ts.plot() 应用DF能够同时画多个Series的图像: df3 = pd.DataFrame(np.random.randn(365, 4), index=ts.index, columns=list("ABCD")) df3= df3.cumsum()df3.plot() 能够指定行和列应用的数据: df3 = pd.DataFrame(np.random.randn(365, 2), columns=["B", "C"]).cumsum()df3["A"] = pd.Series(list(range(len(df))))df3.plot(x="A", y="B"); 其余图像plot() 反对很多图像类型,包含bar, hist, box, density, area, scatter, hexbin, pie等,上面咱们别离举例子来看下怎么应用。 bar df.iloc[5].plot(kind="bar"); 多个列的bar: df2 = pd.DataFrame(np.random.rand(10, 4), columns=["a", "b", "c", "d"])df2.plot.bar(); stacked bardf2.plot.bar(stacked=True); barhbarh 示意横向的bar图: df2.plot.barh(stacked=True); Histogramsdf2.plot.hist(alpha=0.5); boxdf.plot.box(); box能够自定义色彩: color = { ....: "boxes": "DarkGreen", ....: "whiskers": "DarkOrange", ....: "medians": "DarkBlue", ....: "caps": "Gray", ....: }df.plot.box(color=color, sym="r+"); ...

July 7, 2021 · 4 min · jiezi

关于pandas:Pandas高级教程之category数据类型

简介Pandas中有一种非凡的数据类型叫做category。它示意的是一个类别,个别用在统计分类中,比方性别,血型,分类,级别等等。有点像java中的enum。 明天给大家具体解说一下category的用法。 创立category应用Series创立在创立Series的同时增加dtype="category"就能够创立好category了。category分为两局部,一部分是order,一部分是字面量: In [1]: s = pd.Series(["a", "b", "c", "a"], dtype="category")In [2]: sOut[2]: 0 a1 b2 c3 adtype: categoryCategories (3, object): ['a', 'b', 'c']能够将DF中的Series转换为category: In [3]: df = pd.DataFrame({"A": ["a", "b", "c", "a"]})In [4]: df["B"] = df["A"].astype("category")In [5]: df["B"]Out[32]: 0 a1 b2 c3 aName: B, dtype: categoryCategories (3, object): [a, b, c]能够创立好一个pandas.Categorical ,将其作为参数传递给Series: In [10]: raw_cat = pd.Categorical( ....: ["a", "b", "c", "a"], categories=["b", "c", "d"], ordered=False ....: ) ....: In [11]: s = pd.Series(raw_cat)In [12]: sOut[12]: 0 NaN1 b2 c3 NaNdtype: categoryCategories (3, object): ['b', 'c', 'd']应用DF创立创立DataFrame的时候,也能够传入 dtype="category": ...

June 28, 2021 · 5 min · jiezi

关于pandas:Pandas高级教程之处理缺失数据

简介在数据处理中,Pandas会将无奈解析的数据或者缺失的数据应用NaN来示意。尽管所有的数据都有了相应的示意,然而NaN很显著是无奈进行数学运算的。 本文将会解说Pandas对于NaN数据的解决办法。 NaN的例子下面讲到了缺失的数据会被体现为NaN,咱们来看一个具体的例子: 咱们先来构建一个DF: In [1]: df = pd.DataFrame(np.random.randn(5, 3), index=['a', 'c', 'e', 'f', 'h'], ...: columns=['one', 'two', 'three']) ...: In [2]: df['four'] = 'bar'In [3]: df['five'] = df['one'] > 0In [4]: dfOut[4]: one two three four fivea 0.469112 -0.282863 -1.509059 bar Truec -1.135632 1.212112 -0.173215 bar Falsee 0.119209 -1.044236 -0.861849 bar Truef -2.104569 -0.494929 1.071804 bar Falseh 0.721555 -0.706771 -1.039575 bar True下面DF只有acefh这几个index,咱们从新index一下数据: In [5]: df2 = df.reindex(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])In [6]: df2Out[6]: one two three four fivea 0.469112 -0.282863 -1.509059 bar Trueb NaN NaN NaN NaN NaNc -1.135632 1.212112 -0.173215 bar Falsed NaN NaN NaN NaN NaNe 0.119209 -1.044236 -0.861849 bar Truef -2.104569 -0.494929 1.071804 bar Falseg NaN NaN NaN NaN NaNh 0.721555 -0.706771 -1.039575 bar True数据缺失,就会产生很多NaN。 ...

June 24, 2021 · 5 min · jiezi

关于pandas:Pandas高级教程之处理text数据

简介在1.0之前,只有一种模式来存储text数据,那就是object。在1.0之后,增加了一个新的数据类型叫做StringDtype 。明天将会给大家解说Pandas中text中的那些事。 创立text的DF先看下常见的应用text来构建DF的例子: In [1]: pd.Series(['a', 'b', 'c'])Out[1]: 0 a1 b2 cdtype: object如果要应用新的StringDtype,能够这样: In [2]: pd.Series(['a', 'b', 'c'], dtype="string")Out[2]: 0 a1 b2 cdtype: stringIn [3]: pd.Series(['a', 'b', 'c'], dtype=pd.StringDtype())Out[3]: 0 a1 b2 cdtype: string或者应用astype进行转换: In [4]: s = pd.Series(['a', 'b', 'c'])In [5]: sOut[5]: 0 a1 b2 cdtype: objectIn [6]: s.astype("string")Out[6]: 0 a1 b2 cdtype: stringString 的办法String能够转换成大写,小写和统计它的长度: In [24]: s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'], ....: dtype="string") ....: In [25]: s.str.lower()Out[25]: 0 a1 b2 c3 aaba4 baca5 <NA>6 caba7 dog8 catdtype: stringIn [26]: s.str.upper()Out[26]: 0 A1 B2 C3 AABA4 BACA5 <NA>6 CABA7 DOG8 CATdtype: stringIn [27]: s.str.len()Out[27]: 0 11 12 13 44 45 <NA>6 47 38 3dtype: Int64还能够进行trip操作: ...

June 23, 2021 · 4 min · jiezi

关于pandas:Pandas高级教程之Dataframe的重排和旋转

简介应用Pandas的pivot办法能够将DF进行旋转变换,本文将会具体解说pivot的机密。 应用Pivotpivot用来重组DF,应用指定的index,columns和values来对现有的DF进行重构。 看一个Pivot的例子: 通过pivot变动,新的DF应用foo中的值作为index,应用bar的值作为columns,zoo作为对应的value。 再看一个工夫变动的例子: In [1]: dfOut[1]: date variable value0 2000-01-03 A 0.4691121 2000-01-04 A -0.2828632 2000-01-05 A -1.5090593 2000-01-03 B -1.1356324 2000-01-04 B 1.2121125 2000-01-05 B -0.1732156 2000-01-03 C 0.1192097 2000-01-04 C -1.0442368 2000-01-05 C -0.8618499 2000-01-03 D -2.10456910 2000-01-04 D -0.49492911 2000-01-05 D 1.071804In [3]: df.pivot(index='date', columns='variable', values='value')Out[3]: variable A B C Ddate 2000-01-03 0.469112 -1.135632 0.119209 -2.1045692000-01-04 -0.282863 1.212112 -1.044236 -0.4949292000-01-05 -1.509059 -0.173215 -0.861849 1.071804如果残余的value,多于一列的话,每一列都会有相应的columns值: In [4]: df['value2'] = df['value'] * 2In [5]: pivoted = df.pivot(index='date', columns='variable')In [6]: pivotedOut[6]: value value2 variable A B C D A B C Ddate 2000-01-03 0.469112 -1.135632 0.119209 -2.104569 0.938225 -2.271265 0.238417 -4.2091382000-01-04 -0.282863 1.212112 -1.044236 -0.494929 -0.565727 2.424224 -2.088472 -0.9898592000-01-05 -1.509059 -0.173215 -0.861849 1.071804 -3.018117 -0.346429 -1.723698 2.143608通过抉择value2,能够失去相应的子集: ...

June 15, 2021 · 6 min · jiezi

关于pandas:Pandas高级教程之Dataframe的合并

简介Pandas提供了很多合并Series和Dataframe的弱小的性能,通过这些性能能够不便的进行数据分析。本文将会具体解说如何应用Pandas来合并Series和Dataframe。 应用concatconcat是最罕用的合并DF的办法,先看下concat的定义: pd.concat(objs, axis=0, join='outer', ignore_index=False, keys=None, levels=None, names=None, verify_integrity=False, copy=True)看一下咱们常常会用到的几个参数: objs是Series或者Series的序列或者映射。 axis指定连贯的轴。 join : {‘inner’, ‘outer’}, 连贯形式,怎么解决其余轴的index,outer示意合并,inner示意交加。 ignore_index: 疏忽本来的index值,应用0,1,… n-1来代替。 copy:是否进行拷贝。 keys:指定最外层的多层次构造的index。 咱们先定义几个DF,而后看一下怎么应用concat把这几个DF连接起来: In [1]: df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], ...: 'B': ['B0', 'B1', 'B2', 'B3'], ...: 'C': ['C0', 'C1', 'C2', 'C3'], ...: 'D': ['D0', 'D1', 'D2', 'D3']}, ...: index=[0, 1, 2, 3]) ...: In [2]: df2 = pd.DataFrame({'A': ['A4', 'A5', 'A6', 'A7'], ...: 'B': ['B4', 'B5', 'B6', 'B7'], ...: 'C': ['C4', 'C5', 'C6', 'C7'], ...: 'D': ['D4', 'D5', 'D6', 'D7']}, ...: index=[4, 5, 6, 7]) ...: In [3]: df3 = pd.DataFrame({'A': ['A8', 'A9', 'A10', 'A11'], ...: 'B': ['B8', 'B9', 'B10', 'B11'], ...: 'C': ['C8', 'C9', 'C10', 'C11'], ...: 'D': ['D8', 'D9', 'D10', 'D11']}, ...: index=[8, 9, 10, 11]) ...: In [4]: frames = [df1, df2, df3]In [5]: result = pd.concat(frames)df1,df2,df3定义了同样的列名和不同的index,而后将他们放在frames中形成了一个DF的list,将其作为参数传入concat就能够进行DF的合并。 ...

June 14, 2021 · 5 min · jiezi

关于pandas:Pandas之深入理解Pandas的数据结构

[toc] 简介本文将会解说Pandas中根本的数据类型Series和DataFrame,并具体解说这两种类型的创立,索引等根本行为。 应用Pandas须要援用上面的lib: In [1]: import numpy as npIn [2]: import pandas as pdSeriesSeries是一维带label和index的数组。咱们应用上面的办法来创立一个Series: >>> s = pd.Series(data, index=index)这里的data能够是Python的字典,np的ndarray,或者一个标量。 index是一个横轴label的list。接下来咱们别离来看下怎么创立Series。 从ndarray创立s = pd.Series(np.random.randn(5), index=['a', 'b', 'c', 'd', 'e'])sOut[67]: a -1.300797b -2.044172c -1.170739d -0.445290e 1.208784dtype: float64应用index获取index: s.indexOut[68]: Index(['a', 'b', 'c', 'd', 'e'], dtype='object')从dict创立d = {'b': 1, 'a': 0, 'c': 2}pd.Series(d)Out[70]: a 0b 1c 2dtype: int64从标量创立pd.Series(5., index=['a', 'b', 'c', 'd', 'e'])Out[71]: a 5.0b 5.0c 5.0d 5.0e 5.0dtype: float64Series 和 ndarraySeries和ndarray是很相似的,在Series中应用index数值体现的就像ndarray: s[0]Out[72]: -1.3007972194268396s[:3]Out[73]: a -1.300797b -2.044172c -1.170739dtype: float64s[s > s.median()]Out[74]: d -0.445290e 1.208784dtype: float64s[[4, 3, 1]]Out[75]: e 1.208784d -0.445290b -2.044172dtype: float64Series和dict如果应用label来拜访Series,那么它的体现就和dict很像: ...

June 11, 2021 · 3 min · jiezi

关于pandas:Pandas之Pandas高级教程以铁达尼号真实数据为例

简介明天咱们会解说一下Pandas的高级教程,包含读写文件、选取子集和图形示意等。 读写文件数据处理的一个关键步骤就是读取文件进行剖析,而后将剖析处理结果再次写入文件。 Pandas反对多种文件格式的读取和写入: In [108]: pd.read_ read_clipboard() read_excel() read_fwf() read_hdf() read_json read_parquet read_sas read_sql_query read_stata read_csv read_feather() read_gbq() read_html read_msgpack read_pickle read_sql read_sql_table read_table 接下来咱们会以Pandas官网提供的Titanic.csv为例来解说Pandas的应用。 Titanic.csv提供了800多个泰坦利特号上乘客的信息,是一个891 rows x 12 columns的矩阵。 咱们应用Pandas来读取这个csv: In [5]: titanic=pd.read_csv("titanic.csv")read_csv办法会将csv文件转换成为pandas 的DataFrame。 默认状况下咱们间接应用DF变量,会默认展现前5行和后5行数据: In [3]: titanicOut[3]: PassengerId Survived Pclass Name Sex ... Parch Ticket Fare Cabin Embarked0 1 0 3 Braund, Mr. Owen Harris male ... 0 A/5 21171 7.2500 NaN S1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female ... 0 PC 17599 71.2833 C85 C2 3 1 3 Heikkinen, Miss. Laina female ... 0 STON/O2. 3101282 7.9250 NaN S3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female ... 0 113803 53.1000 C123 S4 5 0 3 Allen, Mr. William Henry male ... 0 373450 8.0500 NaN S.. ... ... ... ... ... ... ... ... ... ... ...886 887 0 2 Montvila, Rev. Juozas male ... 0 211536 13.0000 NaN S887 888 1 1 Graham, Miss. Margaret Edith female ... 0 112053 30.0000 B42 S888 889 0 3 Johnston, Miss. Catherine Helen "Carrie" female ... 2 W./C. 6607 23.4500 NaN S889 890 1 1 Behr, Mr. Karl Howell male ... 0 111369 30.0000 C148 C890 891 0 3 Dooley, Mr. Patrick male ... 0 370376 7.7500 NaN Q[891 rows x 12 columns]能够应用head(n)和tail(n)来指定特定的行数: ...

June 7, 2021 · 6 min · jiezi

关于pandas:Pandas之Pandas简洁教程

简介pandas是建设在Python编程语言之上的一种疾速,弱小,灵便且易于应用的开源数据分析和解决工具,它含有使数据荡涤和剖析⼯ 作变得更快更简略的数据结构和操作⼯具。pandas常常和其它⼯具⼀同使⽤,如数值计算⼯具NumPy和SciPy,剖析库statsmodels和scikit-learn,和数据可视化库matplotlib等。 pandas是基于NumPy数组构建的,尽管pandas采⽤了⼤量的NumPy编码⻛格,但⼆者最⼤的不同是pandas是专⻔为解决表格和混淆数据设计的。⽽NumPy更适宜解决统⼀的数值数组数据。 本文是对于Pandas的简洁教程。 对象创立因为Pandas是基于NumPy数组来构建的,所以咱们在援用的时候须要同时援用Pandas和NumPy: In [1]: import numpy as npIn [2]: import pandas as pdPandas中最次要的两个数据结构是Series和DataFrame。 Series和一维数组很类似,它是由NumPy的各种数据类型来组成的,同时还蕴含了和这组数据相干的index。 咱们来看一个Series的例子: In [3]: pd.Series([1, 3, 5, 6, 8])Out[3]:0 11 32 53 64 8dtype: int64右边的是索引,左边的是值。因为咱们在创立Series的时候并没有指定index,所以index是从0开始到n-1完结。 Series在创立的时候还能够传入np.nan示意空值: In [4]: pd.Series([1, 3, 5, np.nan, 6, 8])Out[4]:0 1.01 3.02 5.03 NaN4 6.05 8.0dtype: float64DataFrame是⼀个表格型的数据结构,它含有⼀组有序的列,每列能够是不同的值类型(数值、字符串、布尔值等)。 DataFrame既有⾏索引也有列索引,它能够被看做由Series组成的字典(共⽤同⼀个索引)。 看一个创立DataFrame的例子: In [5]: dates = pd.date_range('20201201', periods=6)In [6]: datesOut[6]:DatetimeIndex(['2020-12-01', '2020-12-02', '2020-12-03', '2020-12-04', '2020-12-05', '2020-12-06'], dtype='datetime64[ns]', freq='D')下面咱们创立了一个index的list。 而后应用这个index来创立一个DataFrame: In [7]: pd.DataFrame(np.random.randn(6, 4), index=dates, columns=list('ABCD'))Out[7]: A B C D2020-12-01 1.536312 -0.318095 -0.737956 0.1433522020-12-02 1.325221 0.065641 -2.763370 -0.1305112020-12-03 -1.143560 -0.805807 0.174722 0.4270272020-12-04 -0.724206 0.050155 -0.648675 -0.6451662020-12-05 0.182411 0.956385 0.349465 -0.4840402020-12-06 1.857108 1.245928 -0.767316 -1.890586下面的DataFrame接管三个参数,第一个参数是DataFrame的表格数据,第二个参数是index的值,也能够看做是行名,第三个参数是列名。 ...

June 5, 2021 · 6 min · jiezi

关于pandas:pandas数据分析-pandasDataFrame数据修改索引设置数据组合

微信公众号:Python 集中营简略的事件反复做,反复的事件保持做,保持的事件用心做;你的必定是我保持的能源,如果这篇文章对你有帮忙,点个关注吧! 相干扩大库1# -*- coding: UTF-8 -*-23import pandas as pd456data_dict = {'first_col': [1, 2, 3, 4], 'second_col': [5, 6, 7, 8]}78df = pd.DataFrame(data_dict)数据批改 1import numpy as np 2 3# 转换某一列的数据类型 4 5df['first_col']=pd.DataFrame(df['first_col'],dtype=np.float32) 6 7# 从新定义列名 8 9df.columns = ['first_col_1','second_col_1']1011print(df)1213# 批改局部列名1415df.rename(columns = {'first_col_1':'first_col_2','second_col_1':'second_col_2'},inplace = True)1617print(df)1819# 依照某个或多个字段排序,ascending = False为降序、ascending = True为升序2021df = df.sort_values(by=['first_col_2','second_col_2'],ascending = False)2223print(df)2425# 依照索引排序,ascending = False为降序、ascending = True为升序2627df = df.sort_index(axis = 0,ascending = True)2829print(df)3031# 按数据地位批改数据,如下将第二行、第二列数据批改为93233df.iloc[1,1] = 93435print(df)3637# 现有列计算生成新的列3839df['third_col_2'] = df['first_col_2'] + df['second_col_2']4041# first_col_2 second_col_2 third_col_242# 0 1.0 5 6.043# 1 2.0 9 11.044# 2 3.0 7 10.045# 3 4.0 8 12.0索引设置 1# 从新设置索引 2 3df['index']=range(len(df['first_col'])) 4 5df.set_index(df['index']) 6 7print(df) 8 9# 设置日期为索引,定义日期范畴:start开始日期、periods数据行数1011date = pd.date_range(start='1/1/2021',periods=len(df['first_col']))1213df = df.set_index(date)1415print(df)数据连贯与组合 1# 定义两个DataFrame数据 2 3df1 = pd.DataFrame(data_dict) 4 5df2 = pd.DataFrame(data_dict) 6 7# concat() 函数连贯,axis=0示意当两个数据对象连接时存在不同的列不会生成新的列,axis=1示意会生成新的列 8 9df3=pd.concat([df1,df2],axis=0)1011print(df3)1213# 扩大函数append() 向df1中增加df2中的所有行、最初赋值给df31415df3 = df1.append(df2.loc[:])1617print(df3)DataFrame输入 1# excel保留 2 3df.to_excel('/usr/data.xls') 4 5# csv 保留 6 7df.to_csv('/usr/data.csv') 8 9# 输入字典模式1011dict_ = df.to_dict(orient="dict")1213print(dict_)更多精彩返回微信公众号【Python 集中营】,专一于 python 技术栈,材料获取、交换社区、干货分享,期待你的退出~ ...

April 19, 2021 · 1 min · jiezi

关于数据分析:python数据分析-pandasDataFrame基本聚合函数统计数据

相干扩大库1# -*- coding: UTF-8 -*-23import pandas as pd45data_dict = {'first_col': [1, 2, 3, 4], 'second_col': [5, 6, 7, 8]}67df = pd.DataFrame(data_dict)统计简略信息 1# 生成简要的数据统计数据 2 3describe(percentiles=None, include=None, exclude=None) 4# first_col second_col 5# count 4.000000 4.000000 总数量 6# mean 2.500000 6.500000 均值 7# std 1.290994 1.290994 方差 8# min 1.000000 5.000000 最小值 9# 25% 1.750000 5.750000 25%数据量时的数据10# 50% 2.500000 6.500000 50%数据量时的数据11# 75% 3.250000 7.250000 75%数据量时的数据12# max 4.000000 8.000000 最大值1314# percentiles 指定统计量,默认是25%、50%、75%时的数据量15# include 蕴含数据类型,include='all'同时蕴含离散型与数值型的统计特色、include='O'蕴含离散型、默认include=None蕴含数值型16# exclude 不蕴含数据类型,exclude='O'不蕴含离散型1718print(df.describe(percentiles=[.2,.4,.6,.8], include=None, exclude='O'))head()与tail()函数1# head() 函数前多少行23print(df.head(2))45# tail() 函数后多少行67print(df.tail(2))数据聚合统计 1# 获取某一列的和 2 3print(df['first_col'].sum()) 4 5# 获取某一列的均值 6 7print(df['first_col'].mean()) 8 9# 获取某一列的总数量1011print(df['first_col'].count())1213# 获取某一列的最大值1415print(df['first_col'].max())1617# 获取某一列的最小值1819print(df['first_col'].min())数据结构统计 1# 返回列的数据类型 2 3print(df.dtypes) 4 5# size()返回数据总数 6 7print(df.size) 8 9# 返回数据形态,几行几列1011print(df.shape)1213# 返回列数1415print(df.ndim)1617# 返回每一列的名称1819print(df.axes)更多精彩返回微信公众号【Python 集中营】,专一于 python 技术栈,材料获取、交换社区、干货分享,期待你的退出~ ...

April 18, 2021 · 1 min · jiezi

关于pandas:python-dataframe-保留每一列都大于-3-的每一行

Example:保留每一列都大于 3 的每一行。 输出: data: A B C 1 2 3 1 4 5 7 8 9脚本: import pandas as pddf = pd.read_csv('data', header = 0, sep = '\t')df = df[(df > 3).any(1)]后果: A B C1 4 57 8 9

December 17, 2020 · 1 min · jiezi

关于pandas:骚操作嵌套-JSON-秒变-Dataframe

首发于公众号:Python数据迷信作者:东哥腾飞 调用API和文档数据库会返回嵌套的JSON对象,当咱们应用Python尝试将嵌套构造中的键转换为列时,数据加载到pandas中往往会失去如下后果: df = pd.DataFrame.from_records(results [“ issues”],columns = [“ key”,“ fields”])阐明:这里results是一个大的字典,issues是results其中的一个键,issues的值为一个嵌套JSON对象字典的列表,前面会看到JSON嵌套构造。问题在于API返回了嵌套的JSON构造,而咱们关怀的键在对象中确处于不同级别。 嵌套的JSON构造张成这样的。 而咱们想要的是上面这样的。 上面以一个API返回的数据为例,API通常蕴含无关字段的元数据。假如上面这些是咱们想要的字段。 key:JSON密钥,在第一级的地位。summary:第二级的“字段”对象。status name:第三级地位。statusCategory name:位于第4个嵌套级别。如上,咱们抉择要提取的字段在issues列表内的JSON构造中别离处于4个不同的嵌套级别,一环扣一环。 { "expand": "schema,names", "issues": [ { "fields": { "issuetype": { "avatarId": 10300, "description": "", "id": "10005", "name": "New Feature", "subtask": False }, "status": { "description": "A resolution has been taken, and it is awaiting verification by reporter. From here issues are either reopened, or are closed.", "id": "5", "name": "Resolved", "statusCategory": { "colorName": "green", "id": 3, "key": "done", "name": "Done", } }, "summary": "Recovered data collection Defraglar $MFT problem" }, "id": "11861", "key": "CAE-160", }, { "fields": { ... more issues], "maxResults": 5, "startAt": 0, "total": 160}一个不太好的解决方案一种抉择是间接撸码,写一个查找特定字段的函数,但问题是必须对每个嵌套字段调用此函数,而后再调用.apply到DataFrame中的新列。 ...

November 9, 2020 · 1 min · jiezi

关于pandas:再见可视化你好Pandas

起源:Python数据迷信作者:东哥腾飞用Python做数据分析离不开pandas,pnadas更多的承载着解决和变换数据的角色,pands中也内置了可视化的操作,但成果很糙。 因而,大家在用Python做数据分析时,失常的做法是用先pandas先进行数据处理,而后再用Matplotlib、Seaborn、Plotly、Bokeh等对dataframe或者series进行可视化操作。 然而说实话,每个可视化包都有本人独特的办法和函数,常常忘,这是让我始终很头疼的中央。 好消息来了!从最新的pandas版本0.25.3开始,不再须要下面的操作了,数据处理和可视化齐全能够用pandas一个就全副搞定。 pandas当初能够应用Plotly、Bokeh作为可视化的backend,间接实现交互性操作,无需再独自应用可视化包了。 上面咱们一起看看如何应用。 1. 激活backend在import了pandas之后,间接应用上面这段代码激活backend,比方上面要激活plotly。 pd.options.plotting.backend = 'plotly'目前,pandas的backend反对以下几个可视化包。 PlotlyHoloviewsMatplotlibPandas_bokehHyplot2. Plotly backendPlotly的益处是,它基于Javascript版本的库写进去的,因而生成的Web可视化图表,能够显示为HTML文件或嵌入基于Python的Web应用程序中。 上面看下如何用plotly作为pandas的backend进行可视化。 如果还没装置Plotly,则须要装置它pip intsall plotly。如果是在Jupyterlab中应用Plotly,那还须要执行几个额定的装置步骤来显示可视化成果。 首先,装置IPywidgets。 pip install jupyterlab "ipywidgets>=7.5"而后运行此命令以装置Plotly扩大。 jupyter labextension install jupyterlab-plotly@4.8.1示例选自openml.org的的数据集,链接如下: 数据链接:https://www.openml.org/d/187这个数据也是Scikit-learn中的样本数据,所以也能够应用以下代码将其间接导入。 import pandas as pdimport numpy as npfrom sklearn.datasets import fetch_openmlpd.options.plotting.backend = 'plotly'X,y = fetch_openml("wine", version=1, as_frame=True, return_X_y=True)data = pd.concat([X,y], axis=1)data.head()该数据集是葡萄酒相干的,蕴含葡萄酒类型的许多性能和相应的标签。数据集的前几行如下所示。 上面应用Plotly backend摸索一下数据集。 绘图形式与失常应用Pandas内置的绘图操作简直雷同,只是当初以丰盛的Plotly显示可视化成果。 上面的代码绘制了数据集中两个因素之间的关系。 fig = data[['Alcohol', 'Proline']].plot.scatter(y='Alcohol', x='Proline')fig.show() 如果将鼠标悬停在图表上,能够抉择将图表下载为高质量的图像文件。 咱们能够联合Pandas的groupby函数创立一个条形图,总结各类之间Hue的均值差别。 data[['Hue','class']].groupby(['class']).mean().plot.bar() 将class增加到咱们方才创立的散点图中。通过Plotly能够轻松地为每个类利用不同的色彩,以便直观地看到分类。 fig = data[['Hue', 'Proline', 'class']].plot.scatter(x='Hue', y='Proline', color='class', title='Proline and Hue by wine class')fig.show() ...

October 16, 2020 · 1 min · jiezi

关于pandas:Pandas入门教程四

groupby分组import pandas as pdimport numpy as npdf=pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'], 'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'], 'C' : np.random.randn(8), 'D' : np.random.randn(8)})print(df)grouped=df.groupby('A')print('-'*30)print(grouped.count())print('-'*30)grouped=df.groupby(['A','B'])print(grouped.count())print('-'*30)# 通过函数分组def get_letter_type(letter): if letter.lower() in 'aeiou': return 'a' else: return 'b'grouped=df.groupby(get_letter_type,axis=1)print(grouped.count()) A B C D0 foo one 1.429387 0.6435691 bar one -0.858448 -0.2130342 foo two 0.375644 0.2145843 bar three 0.042284 -0.3304814 foo two -1.421967 0.7681765 bar two 1.293483 -0.3990036 foo one -1.101385 -0.2363417 foo three -0.852603 -1.718694------------------------------ B C DA bar 3 3 3foo 5 5 5------------------------------ C DA B bar one 1 1 three 1 1 two 1 1foo one 2 2 three 1 1 two 2 2------------------------------ a b0 1 31 1 32 1 33 1 34 1 35 1 36 1 37 1 3se=pd.Series([1,2,3,4,5],[6,9,8,9,8])print(se)se.groupby(level=0)6 19 28 39 48 5dtype: int64<pandas.core.groupby.generic.SeriesGroupBy object at 0x111b00040># 分组求和grouped=se.groupby(level=0).sum()print(grouped)6 18 89 6dtype: int64df2=pd.DataFrame({'X':['A','B','A','B'],'Y':[1,2,3,4]})print(df2) X Y0 A 11 B 22 A 33 B 4# 按X分组,并查问A列的数据grp=df2.groupby('X').get_group('A')print(grp) X Y0 A 12 A 3Pandas 多级索引arrays = [['bar', 'bar', 'baz', 'baz', 'foo', 'foo', 'qux', 'qux'], ['one', 'two', 'one', 'two', 'one', 'two', 'one', 'two']]index=pd.MultiIndex.from_arrays(arrays,names=['first','second'])print(index)MultiIndex([('bar', 'one'), ('bar', 'two'), ('baz', 'one'), ('baz', 'two'), ('foo', 'one'), ('foo', 'two'), ('qux', 'one'), ('qux', 'two')], names=['first', 'second'])s=pd.Series(np.random.randn(8),index=index)print(s)first secondbar one 0.120979 two -0.440384baz one 0.515106 two -0.019882foo one 1.149595 two -0.369984qux one -0.930438 two 0.146044dtype: float64# 分组求和grouped=s.groupby(level='first')print(grouped.sum())firstbar -0.319405baz 0.495224foo 0.779611qux -0.784394dtype: float64grouped=df.groupby(['A','B'])print(grouped.size())A B bar one 1 three 1 two 1foo one 2 three 1 two 2dtype: int64print(df) A B C D0 foo one 1.429387 0.6435691 bar one -0.858448 -0.2130342 foo two 0.375644 0.2145843 bar three 0.042284 -0.3304814 foo two -1.421967 0.7681765 bar two 1.293483 -0.3990036 foo one -1.101385 -0.2363417 foo three -0.852603 -1.718694print(grouped.describe().head()) C \ count mean std min 25% 50% 75% A B bar one 1.0 -0.858448 NaN -0.858448 -0.858448 -0.858448 -0.858448 three 1.0 0.042284 NaN 0.042284 0.042284 0.042284 0.042284 two 1.0 1.293483 NaN 1.293483 1.293483 1.293483 1.293483 foo one 2.0 0.164001 1.789526 -1.101385 -0.468692 0.164001 0.796694 three 1.0 -0.852603 NaN -0.852603 -0.852603 -0.852603 -0.852603 D \ max count mean std min 25% 50% A B bar one -0.858448 1.0 -0.213034 NaN -0.213034 -0.213034 -0.213034 three 0.042284 1.0 -0.330481 NaN -0.330481 -0.330481 -0.330481 two 1.293483 1.0 -0.399003 NaN -0.399003 -0.399003 -0.399003 foo one 1.429387 2.0 0.203614 0.622191 -0.236341 -0.016364 0.203614 three -0.852603 1.0 -1.718694 NaN -1.718694 -1.718694 -1.718694 ...

September 28, 2020 · 4 min · jiezi

关于pandas:Pandas入门教程二

merge合并DataFrameimport pandas as pdleft=pd.DataFrame({ 'key':['k0','k1','k2','k3','k4','k5'], 'A':['A0','A1','A2','A3','A4','A5'], 'B':['B0','B1','B2','B3','B4','B5']})right=pd.DataFrame({ 'key':['k0','k1','k2','k3','k4','k5'], 'C':['C0','C1','C2','C3','C4','C5'], 'D':['D0','D1','D2','D3','D4','D5']})print(left)print('-'*20)print(right) key A B0 k0 A0 B01 k1 A1 B12 k2 A2 B23 k3 A3 B34 k4 A4 B45 k5 A5 B5-------------------- key C D0 k0 C0 D01 k1 C1 D12 k2 C2 D23 k3 C3 D34 k4 C4 D45 k5 C5 D5# 合并res=pd.merge(left,right)print(res)print('-'*20)# 指定合并的keyres=pd.merge(left,right,on='key')print(res) key A B C D0 k0 A0 B0 C0 D01 k1 A1 B1 C1 D12 k2 A2 B2 C2 D23 k3 A3 B3 C3 D34 k4 A4 B4 C4 D45 k5 A5 B5 C5 D5-------------------- key A B C D0 k0 A0 B0 C0 D01 k1 A1 B1 C1 D12 k2 A2 B2 C2 D23 k3 A3 B3 C3 D34 k4 A4 B4 C4 D45 k5 A5 B5 C5 D5left = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'], 'key2': ['K0', 'K1', 'K2', 'K3'], 'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3']})right = pd.DataFrame({'key1': ['K0', 'K1', 'K2', 'K3'], 'key2': ['K0', 'K1', 'K2', 'K4'], 'C': ['C0', 'C1', 'C2', 'C3'], 'D': ['D0', 'D1', 'D2', 'D3']})print(left)print('-'*20)print(right) key1 key2 A B0 K0 K0 A0 B01 K1 K1 A1 B12 K2 K2 A2 B23 K3 K3 A3 B3-------------------- key1 key2 C D0 K0 K0 C0 D01 K1 K1 C1 D12 K2 K2 C2 D23 K3 K4 C3 D3# 默认取交加 how='inner'res=pd.merge(left,right,on=['key1','key2'])print(res) key1 key2 A B C D0 K0 K0 A0 B0 C0 D01 K1 K1 A1 B1 C1 D12 K2 K2 A2 B2 C2 D2# how='outer' 取并集res=pd.merge(left,right,on=['key1','key2'],how='outer')print(res) key1 key2 A B C D0 K0 K0 A0 B0 C0 D01 K1 K1 A1 B1 C1 D12 K2 K2 A2 B2 C2 D23 K3 K3 A3 B3 NaN NaN4 K3 K4 NaN NaN C3 D3# 显示合并数据中数据来自哪个表res=pd.merge(left,right,on=['key1','key2'],how='outer',indicator=True)print(res) key1 key2 A B C D _merge0 K0 K0 A0 B0 C0 D0 both1 K1 K1 A1 B1 C1 D1 both2 K2 K2 A2 B2 C2 D2 both3 K3 K3 A3 B3 NaN NaN left_only4 K3 K4 NaN NaN C3 D3 right_only# 左链接res=pd.merge(left,right,on=['key1','key2'],how='left')print(res)print('-'*30)# 右链接res=pd.merge(left,right,on=['key1','key2'],how='right')print(res) key1 key2 A B C D0 K0 K0 A0 B0 C0 D01 K1 K1 A1 B1 C1 D12 K2 K2 A2 B2 C2 D23 K3 K3 A3 B3 NaN NaN------------------------------ key1 key2 A B C D0 K0 K0 A0 B0 C0 D01 K1 K1 A1 B1 C1 D12 K2 K2 A2 B2 C2 D23 K3 K4 NaN NaN C3 D3join 拼接列,次要用于索引上的合并left = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'], 'B': ['B0', 'B1', 'B2', 'B3'], 'key': ['K0', 'K1', 'K0', 'K1']})right = pd.DataFrame({'C': ['C0', 'C1'], 'D': ['D0', 'D1']}, index=['K0', 'K1'])print(left)print('-'*15)print(right) A B key0 A0 B0 K01 A1 B1 K12 A2 B2 K03 A3 B3 K1--------------- C DK0 C0 D0K1 C1 D1res=left.join(right,on='key')print(res) A B key C D0 A0 B0 K0 C0 D01 A1 B1 K1 C1 D12 A2 B2 K0 C0 D03 A3 B3 K1 C1 D1Pandas数据透视表df = pd.DataFrame({'Month': ["January", "January", "January", "January", "February", "February", "February", "February", "March", "March", "March", "March"], 'Category': ["Transportation", "Grocery", "Household", "Entertainment", "Transportation", "Grocery", "Household", "Entertainment", "Transportation", "Grocery", "Household", "Entertainment"], 'Amount': [74., 235., 175., 100., 115., 240., 225., 125., 90., 260., 200., 120.]})print(df) Month Category Amount0 January Transportation 74.01 January Grocery 235.02 January Household 175.03 January Entertainment 100.04 February Transportation 115.05 February Grocery 240.06 February Household 225.07 February Entertainment 125.08 March Transportation 90.09 March Grocery 260.010 March Household 200.011 March Entertainment 120.0# 结构一个索引为Category 列为Month 值为Amount的表res=df.pivot(index='Category',columns='Month',values='Amount')print(res)Month February January MarchCategory Entertainment 125.0 100.0 120.0Grocery 240.0 235.0 260.0Household 225.0 175.0 200.0Transportation 115.0 74.0 90.0# 按列求和res.sum(axis=0)MonthFebruary 705.0January 584.0March 670.0dtype: float64# 按行求和res.sum(axis=1)CategoryEntertainment 345.0Grocery 735.0Household 600.0Transportation 279.0dtype: float64pivot_tabledf=pd.read_csv('./pandas/data/titanic.csv')df.columnsIndex(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype='object')#默认求平均值res=df.pivot_table(index='Sex',columns='Pclass',values='Fare')print(res)Pclass 1 2 3Sex female 106.125798 21.970121 16.118810male 67.226127 19.741782 12.661633# 求最大值res=df.pivot_table(index='Sex',columns='Pclass',values='Fare',aggfunc='max')print(res)Pclass 1 2 3Sex female 512.3292 65.0 69.55male 512.3292 73.5 69.55# 统计个数res=df.pivot_table(index='Sex',columns='Pclass',values='Fare',aggfunc='count')print(res)print('-'*20)# crosstab 统计个数res=pd.crosstab(index=df['Sex'],columns=df['Pclass'])print(res)Pclass 1 2 3Sex female 94 76 144male 122 108 347--------------------Pclass 1 2 3Sex female 94 76 144male 122 108 347# 求平均值res=df.pivot_table(index='Sex',columns='Pclass',values='Fare',aggfunc='mean')print(res)Pclass 1 2 3Sex female 106.125798 21.970121 16.118810male 67.226127 19.741782 12.661633# 计算未成年男女存活率df['minor']=df['Age']<=18res=df.pivot_table(index='minor',columns='Sex',values='Survived',aggfunc='mean')print(res)Sex female maleminor False 0.760163 0.167984True 0.676471 0.338028 ...

September 26, 2020 · 3 min · jiezi

关于pandas:利用-Python-进行数据分析Python-数据分析-第-2-版

译者:SeanCheney欢送任何人参加和欠缺:一个人能够走的很快,然而一群人却能够走的更远。 ApacheCN 机器学习交换群 629470233ApacheCN 学习资源Sklearn 与 TensorFlow 机器学习实用指南<!--split--> 在线浏览PDF格局EPUB格局MOBI格局代码仓库下载本书代码(本书GitHub地址):https://github.com/wesm/pydata-book (倡议把代码下载下来之后,装置好Anaconda 3.6,在目录文件夹中用Jupyter notebook关上) 本书是2017年10月20号正式出版的,和第1版的不同之处有: 包含Python教程内的所有代码降级为Python 3.6(第1版应用的是Python 2.7)更新了Anaconda和其它包的Python装置办法更新了Pandas为2017最新版新增了一章,对于更高级的Pandas工具,外加一些tips简要介绍了应用StatsModels和scikit-learn对有些内容进行了从新排版。(译者注1:最大的扭转是把第1版附录中的Python教程,单列成了当初的第2章和第3章,并且进行了裁减。能够说,本书第2版对老手更为敌对了!) (译者注2:毫无疑问,本书是学习Python数据分析最好的参考书。原本想把书名间接译为《Python数据分析》,这样更简短。然而为了尊重第1版的翻译,思考到继承性,还是用老书名。这样读过第一版的老读者能够不便的用之前的书名检索到第二版。作者在写第二版的时候,有些文字是照搬第一版的。所以第二版的翻译也借鉴copy了第一版翻译:即,如果第二版中有和第一版雷同的文字,则copy第一版的中文译本,感觉不妥的中央会稍加批改,剩下的不同的内容就本人翻译。这样做也是为读过第一版的老读者思考——雷同的内容能够间接跳过。)

August 29, 2020 · 1 min · jiezi

关于pandas:ApacheCN-Pandas-译文集

Pandas 秘籍 零、前言一、Pandas 根底二、数据帧基本操作三、开始数据分析四、抉择数据子集五、布尔索引六、索引对齐七、分组以进行汇总,过滤和转换八、将数据重组为参差的表格九、组合 Pandas 对象十、工夫序列剖析十一、Pandas,Matplotlib 和 Seaborn 的可视化Pandas 学习手册中文第二版 零、前言一、Pandas 与数据分析二、启动和运行 Pandas三、用序列示意单变量数据四、用数据帧示意表格和多元数据五、数据帧的构造操作六、索引数据七、类别数据八、数值统计办法九、存取数据十、整顿数据十一、合并,连贯和重塑数据十二、数据聚合十三、工夫序列建模十四、可视化十五、历史股价剖析精通 Pandas 零、前言一、Pandas 和数据分析简介二、Pandas 装置和支持软件三、Pandas 数据结构四、Pandas 的操作,第一局部 -- 索引和抉择五、Pandas 的操作,第二局部 -- 数据的分组,合并和重塑六、解决缺失数据,工夫序列和 Matplotlib 绘图七、统计之旅 -- 经典办法八、贝叶斯统计简介九、Pandas 库体系结构十、R 与 Pandas 的比拟十一、机器学习简介NumPy 和 Pandas 数据分析实用指南 零、前言一、配置 Python 数据分析环境二、摸索 NumPy三、NumPy 数组上的运算四、Pandas 很乏味! 什么是 Pandas?五、Pandas 的算术,函数利用以及映射六、排序,索引和绘图精通 Pandas 探索性剖析 零、前言一、解决不同品种的数据集二、数据抉择三、解决,转换和重塑数据四、像专业人士一样可视化数据

July 18, 2020 · 1 min · jiezi

关于pandas:精通-Pandas-翻译完成

协定:CC BY-NC-SA 4.0欢送任何人参加和欠缺:一个人能够走的很快,然而一群人却能够走的更远。 在线浏览ApacheCN 面试求职交换群 724187166ApacheCN 学习资源目录精通 Pandas零、前言一、Pandas 和数据分析简介二、Pandas 装置和支持软件三、Pandas 数据结构四、Pandas 的操作,第一局部 -- 索引和抉择五、Pandas 的操作,第二局部 -- 数据的分组,合并和重塑六、解决缺失数据,工夫序列和 Matplotlib 绘图七、统计之旅 -- 经典办法八、贝叶斯统计简介九、Pandas 库体系结构十、R 与 Pandas 的比拟十一、机器学习简介奉献指南本我的项目须要校对,欢送大家提交 Pull Request。 请您怯懦地去翻译和改良翻译。尽管咱们谋求卓越,但咱们并不要求您做到美中不足,因而请不要放心因为翻译上犯错——在大部分状况下,咱们的服务器曾经记录所有的翻译,因而您不用放心会因为您的失误受到无法挽回的毁坏。(改编自维基百科)联系方式负责人飞龙: 562826179其余在咱们的 apachecn/apachecn-ds-zh github 上提 issue.发邮件到 Email: apachecn@163.com.在咱们的 组织学习交换群 中分割群主/管理员即可.资助咱们通过平台自带的打赏性能,或点击这里。

July 18, 2020 · 1 min · jiezi

Pandas-学习手册中文第二版翻译完成

原文:Learning pandas协定:CC BY-NC-SA 4.0 欢送任何人参加和欠缺:一个人能够走的很快,然而一群人却能够走的更远。 在线浏览ApacheCN 面试求职交换群 724187166ApacheCN 学习资源目录Pandas 学习手册中文第二版零、前言一、Pandas 与数据分析二、启动和运行 Pandas三、用序列示意单变量数据四、用数据帧示意表格和多元数据五、数据帧的构造操作六、索引数据七、类别数据八、数值统计办法九、存取数据十、整顿数据十一、合并,连贯和重塑数据十二、数据聚合十三、工夫序列建模十四、可视化十五、历史股价剖析奉献指南本我的项目须要校对,欢送大家提交 Pull Request。 请您怯懦地去翻译和改良翻译。尽管咱们谋求卓越,但咱们并不要求您做到美中不足,因而请不要放心因为翻译上犯错——在大部分状况下,咱们的服务器曾经记录所有的翻译,因而您不用放心会因为您的失误受到无法挽回的毁坏。(改编自维基百科)联系方式负责人飞龙: 562826179其余在咱们的 apachecn/apachecn-ds-zh github 上提 issue.发邮件到 Email: apachecn@163.com.在咱们的 组织学习交换群 中分割群主/管理员即可.资助咱们通过平台自带的打赏性能,或点击这里。

July 16, 2020 · 1 min · jiezi

Pandas-秘籍翻译完成

协定:CC BY-NC-SA 4.0欢送任何人参加和欠缺:一个人能够走的很快,然而一群人却能够走的更远。 在线浏览ApacheCN 面试求职交换群 724187166ApacheCN 学习资源目录Pandas 秘籍零、前言一、Pandas 根底二、数据帧基本操作三、开始数据分析四、抉择数据子集五、布尔索引六、索引对齐七、分组以进行汇总,过滤和转换八、将数据重组为参差的表格九、组合 Pandas 对象十、工夫序列剖析十一、Pandas,Matplotlib 和 Seaborn 的可视化奉献指南本我的项目须要校对,欢送大家提交 Pull Request。 请您怯懦地去翻译和改良翻译。尽管咱们谋求卓越,但咱们并不要求您做到美中不足,因而请不要放心因为翻译上犯错——在大部分状况下,咱们的服务器曾经记录所有的翻译,因而您不用放心会因为您的失误受到无法挽回的毁坏。(改编自维基百科)联系方式负责人飞龙: 562826179其余在咱们的 apachecn/apachecn-ds-zh github 上提 issue.发邮件到 Email: apachecn@163.com.在咱们的 组织学习交换群 中分割群主/管理员即可.资助咱们通过平台自带的打赏性能,或点击这里。

July 13, 2020 · 1 min · jiezi

Pandas-DataFrame-使用总结

Pandas 是一个非常好用的库,总结一下 Pandas DataFrame 常见用法,在使用的时候可以快速找到。Pandas DataFrames 是具有带标签的行和列的二维数据结构,可以存储很多类型的数据。如果你熟悉 Excel 的话,可以将 Pandas DataFrames 看做类似于电子表格。 一、引入import numpy as npimport pandas as pd二、创建data = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])c = ['a', 'b', 'c']r = ['A', 'B', 'C']df = pd.DataFrame(data=data, columns=c, index=r)三、排序按列、行名排序# 行名排序 降序df.sort_index(axis=0, ascending=False)# 列名排序 降序df.sort_index(axis=0, ascending=False)按值排序拿出来排序df["a"].sort_values(ascending = False)df 内排序df.sort_values( ['a', 'b', 'c'])四、索引位置索引df.iloc[2] # 选择第二行所有数据, 是Series类型df.iloc[[2]] # 选择第二行所有数据, 是DataFrame类型df.iloc[:, 2] # 选择第二列所有数据, 是Series类型df.iloc[:, [2]] # 选择第二列所有数据, 是DataFrame类型df.iloc[:, 0:2] # 选择0到2列所有数据df.iloc[[2,3], 0:2] # 选择2和3行, 0到2列所有数据df.iat[1, 1] # 根据位置快速取出数据, 获取单个数据推荐这种方法自定义索引df.loc['top'] # 选择指定行数据, 是Series类型df.loc[['top']] # 选择指定行数据, 是DataFrame类型df.loc[:, 'xm'] # 选择指定列数据, 是Series类型(不推荐)df.loc[:, ['xm']] # 选择指定列数据, 是DataFrame类型(不推荐)df.loc[:, ['bj','xm']] # 选择多列数据(不推荐)df.loc[:, 'bj':'xb'] # 选择多列之间所有数据, 列切片只能用这种方法df.loc[['top','count'], 'bj':'xb'] # 选择指定行, 指定列数据df.at['top', 'xm'] # 根据自定义索引快速取出数据, 获取单个数据推荐这种方法布尔索引# 选取所有出生日期大于等于1998年的数据, 这里是字符串比较df[df['csrq']>='1998'] # 选取所有出生日期大于等于1997年小于1999年的数据df[(df['csrq']>='1997')&(data['csrq']<'1999')]# 选取所有出生日期大于等于1997年小于1999年的数据df[df['csrq'].between('1997', '1999')]# 选取所有出生日期大于等于1997年或者姓名为张三的数据df[(df['csrq']>='1997')|(data['xm']=='张三')]# 另一种选取方式(不推荐, 实测效率比上面低)df[df.csrq>='1998'] # 选择字段值为指定内容的数据df[df['xm'].isin(['张三','李四'])] 五、插入与删除# 假设cj列本来不存在, 这样会在列尾添加新的一列cj, 值为s(Series对象), 原地df['cj'] = s # 在第1列位置插入一列dz(地址), 值为s, 原地df.insert(0, 'dz', s)# 在df中添加内容为df2(必须是DataFrame对象)的新列(添加列), 非原地 df.join(df2) # 将df2中的行添加到df的尾部(添加行), 非原地df.append(df2)# 删除单列, 并返回删除的列, 原地df.pop('xm')# 删除指定行, 非原地 df.drop(1) # 删除指定列, axis=1指第2维, axis默认0, 非原地df.drop(['xm', 'xh'], axis=1) 六、DataFrame 重要方法与属性'''重要属性'''df.values # 查看所有元素的valuedf.dtypes # 查看所有元素的类型df.index # 查看所有行名df.index = ['总数', '不同', '最多', '频率'] # 重命名行名df.columns # 查看所有列名df.columns = ['班级', '姓名', '性别', '出生日期'] # 重命名列名df.T # 转置后的df, 非原地'''查看数据'''df.head(n) # 查看df前n条数据, 默认5条df.tail(n) # 查看df后n条数据, 默认5条df.shape() # 查看行数和列数df.info() # 查看索引, 数据类型和内存信息'''数据统计'''df.describe() # 查看数据值列的汇总统计, 是DataFrame类型df.count() # 返回每一列中的非空值的个数df.sum() # 返回每一列的和, 无法计算返回空, 下同df.sum(numeric_only=True) # numeric_only=True代表只计算数字型元素, 下同df.max() # 返回每一列的最大值df.min() # 返回每一列的最小值df.argmax() # 返回最大值所在的自动索引位置df.argmin() # 返回最小值所在的自动索引位置df.idxmax() # 返回最大值所在的自定义索引位置df.idxmin() # 返回最小值所在的自定义索引位置df.mean() # 返回每一列的均值df.median() # 返回每一列的中位数df.var() # 返回每一列的方差df.std() # 返回每一列的标准差df.isnull() # 检查df中空值, NaN为True, 否则False, 返回一个布尔数组df.notnull() # 检查df中空值, 非NaN为True, 否则False, 返回一个布尔数组七、转换成 Numpydf.valuesnp.array(df)八、实战应用获取交易对BTC/USDT最近10日的收盘标准差。 ...

June 1, 2020 · 2 min · jiezi