首页 > 其他分享 >20 个短小精悍的 pandas 骚操作 转载

20 个短小精悍的 pandas 骚操作 转载

时间:2023-06-27 09:01:19浏览次数:28  
标签:cut 20 max dtypes pd diamonds 短小精悍 pandas

1. ExcelWriter

很多时候dataframe里面有中文,如果直接输出到csv里,中文将显示乱码。而Excel就不一样了,ExcelWriterpandas的一个类,可以使dataframe数据框直接输出到excel文件,并可以指定sheets名称。

df1 = pd.DataFrame([["AAA", "BBB"]], columns=["Spam", "Egg"])
df2 = pd.DataFrame([["ABC", "XYZ"]], columns=["Foo", "Bar"])
with ExcelWriter("path_to_file.xlsx") as writer:
    df1.to_excel(writer, sheet_name="Sheet1")
    df2.to_excel(writer, sheet_name="Sheet2")

如果有时间变量,输出时还可以date_format指定时间的格式。另外,它还可以通过mode设置输出到已有的excel文件中,非常灵活。

with ExcelWriter("path_to_file.xlsx", mode="a", engine="openpyxl") as writer:
    df.to_excel(writer, sheet_name="Sheet3")

2. pipe

pipe管道函数可以将多个自定义函数装进同一个操作里,让整个代码更简洁,更紧凑。

比如,我们在做数据清洗的时候,往往代码会很乱,有去重、去异常值、编码转换等等。如果使用pipe,将是这样子的。

diamonds = sns.load_dataset("diamonds")

df_preped = (diamonds.pipe(drop_duplicates).
                      pipe(remove_outliers, ['price', 'carat', 'depth']).
                      pipe(encode_categoricals, ['cut', 'color', 'clarity'])
            )

两个字,干净!

3. factorize

factorize这个函数类似sklearnLabelEncoder,可以实现同样的功能。

# Mind the [0] at the end
diamonds["cut_enc"] = pd.factorize(diamonds["cut"])[0]

>>> diamonds["cut_enc"].sample(5)

52103    2
39813    0
31843    0
10675    0
6634     0
Name: cut_enc, dtype: int64

区别是,factorize返回一个二值元组:编码的列和唯一分类值的列表。

codes, unique = pd.factorize(diamonds["cut"], sort=True)

>>> codes[:10]
array([0, 1, 3, 1, 3, 2, 2, 2, 4, 2], dtype=int64)

>>> unique
['Ideal', 'Premium', 'Very Good', 'Good', 'Fair']

4. explode

explode爆炸功能,可以将array-like的值比如列表,炸开转换成多行。

data = pd.Series([1, 6, 7, [46, 56, 49], 45, [15, 10, 12]]).to_frame("dirty")

data.explode("dirty", ignore_index=True)
图片

5. squeeze

很多时候,我们用.loc筛选想返回一个值,但返回的却是个series。其实,只要使用.squeeze()即可完美解决。比如:

# 没使用squeeze
subset = diamonds.loc[diamonds.index < 1, ["price"]]
# 使用squeeze
subset.squeeze("columns")
图片

可以看到,压缩完结果已经是int64的格式了,而不再是series

6. between

dataframe的筛选方法有很多,常见的locisin等等,但其实还有个及其简洁的方法,专门筛选数值范围的,就是between,用法很简单。

diamonds[diamonds["price"]\
      .between(3500, 3700, inclusive="neither")].sample(5)
图片

7. T

这是所有的dataframe都有的一个简单属性,实现转置功能。它在显示describe时可以很好的搭配。

boston.describe().T.head(10)
图片

8. pandas styler

pandas也可以像excel一样,设置表格的可视化条件格式,而且只需要一行代码即可(可能需要一丢丢的前端HTML和CSS基础知识)。

>>> diabetes.describe().T.drop("count", axis=1)\
                 .style.highlight_max(color="darkred")
图片

9. Pandas options

pandas里提供了很多宏设置选项,被分为下面5大类。

dir(pd.options)
['compute', 'display', 'io', 'mode', 'plotting']

一般情况下使用display会多一点,比如最大、最小显示行数,画图方法,显示精度等等。

pd.options.display.max_columns = None
pd.options.display.precision = 5

10. convert_dtypes

经常使用pandas的都知道,pandas对于经常会将变量类型直接变成object,导致后续无法正常操作。这种情况可以用convert_dtypes进行批量的转换,它会自动推断数据原来的类型,并实现转换。

sample = pd.read_csv(
    "data/station_day.csv",
    usecols=["StationId", "CO", "O3", "AQI_Bucket"],
)

>>> sample.dtypes

StationId      object
CO            float64
O3            float64
AQI_Bucket     object
dtype: object

>>> sample.convert_dtypes().dtypes

StationId      string
CO            float64
O3            float64
AQI_Bucket     string
dtype: object

11. select_dtypes

在需要筛选变量类型的时候,可以直接用selec _dtypes,通过includeexclude筛选和排除变量的类型。

# 选择数值型的变量
diamonds.select_dtypes(include=np.number).head()
# 排除数值型的变量
diamonds.select_dtypes(exclude=np.number).head()

12. mask

mask可以在自定义条件下快速替换单元值,在很多三方库的源码中经常见到。比如下面我们想让age为50-60以外的单元为空,只需要在conohter写好自定义的条件即可。

ages = pd.Series([55, 52, 50, 66, 57, 59, 49, 60]).to_frame("ages")

ages.mask(cond=~ages["ages"].between(50, 60), other=np.nan)
图片

13. 列轴的min、max

虽然大家都知道minmax的功能,但应用在列上的应该不多见。这对函数其实还可以这么用:

index = ["Diamonds", "Titanic", "Iris", "Heart Disease", "Loan Default"]
libraries = ["XGBoost", "CatBoost", "LightGBM", "Sklearn GB"]

df = pd.DataFrame(
    {lib: np.random.uniform(90, 100, 5) for lib in libraries}, index=index
)

>>> df
图片
>>> df.max(axis=1)

Diamonds         99.52684
Titanic          99.63650
Iris             99.10989
Heart Disease    99.31627
Loan Default     97.96728
dtype: float64

14. nlargest、nsmallest

有时我们不仅想要列的最小值/最大值,还想看变量的前 N 个或 ~(top N) 个值。这时nlargestnsmallest就派上用场了。

diamonds.nlargest(5, "price")
图片

15. idmax、idxmin

我们用列轴使用maxmin时,pandas 会返回最大/最小的值。但我现在不需要具体的值了,我需要这个最大值的位置。因为很多时候要锁定位置之后对整个行进行操作,比如单提出来或者删除等,所以这种需求还是很常见的。

使用idxmaxidxmin即可解决。

>>> diamonds.price.idxmax()
27749

>>> diamonds.carat.idxmin()
14

16. value_counts

在数据探索的时候,value_counts是使用很频繁的函数,它默认是不统计空值的,但空值往往也是我们很关心的。如果想统计空值,可以将参数dropna设置为False

ames_housing = pd.read_csv("data/train.csv")

>>> ames_housing["FireplaceQu"].value_counts(dropna=False, normalize=True)

NaN    0.47260
Gd     0.26027
TA     0.21438
Fa     0.02260
Ex     0.01644
Po     0.01370
Name: FireplaceQu, dtype: float64

17. clip

异常值检测是数据分析中常见的操作。使用clip函数可以很容易地找到变量范围之外的异常值,并替换它们。

>>> age.clip(50, 60)
图片

18. at_time、between_time

在有时间粒度比较细的时候,这两个函数超级有用。因为它们可以进行更细化的操作,比如筛选某个时点,或者某个范围时间等,可以细化到小时分钟。

>>> data.at_time("15:00")
图片
from datetime import datetime

>>> data.between_time("09:45", "12:00")
图片

19. hasnans

pandas提供了一种快速方法hasnans来检查给定series是否包含空值。

series = pd.Series([2, 4, 6, "sadf", np.nan])

>>> series.hasnans
True

该方法只适用于series的结构。

20. GroupBy.nth

此功能仅适用于GroupBy对象。具体来说,分组后,nth返回每组的第n行:

>>> diamonds.groupby("cut").nth(5)

图片

 

参考:

[1] https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.ExcelWriter.html

[2] https://towardsdatascience.com/25-pandas-functions-you-didnt-know-existed-p-guarantee-0-8-1a05dcaad5d0

 

标签:cut,20,max,dtypes,pd,diamonds,短小精悍,pandas
From: https://www.cnblogs.com/testzcy/p/17507713.html

相关文章

  • 100 个 pandas 数据分析函数总结 转载
    经过一段时间的整理,本期将分享我认为比较常规的100个实用函数,这些函数大致可以分为六类,分别是统计汇总函数、数据清洗函数、数据筛选、绘图与元素级运算函数、时间序列函数和其他函数。一、统计汇总函数数据分析过程中,必然要做一些数据的统计汇总工作,那么对于这一块的数据运算有哪......
  • NetBeans连接SQLServer2008配置
    一、配置SQLServer(一)SQLServer配置管理器1、打开SQLServer配置管理器  (1)文件路径,我的是C:\Windows\SysWOW64\mmc.exe,也可以从开始菜单找(如下图所示) ps网络资源:Windows10可能在菜单栏里找不到SQLserver的配置管理器,去路径:C:\Windows\system32,在该路径下找文件SQLSer......
  • Windows2008 环境配置
    1.安装配置IIS1、打开控制面板的程序和功能,然后点击打开或关闭windows功能,在弹出的服务管理器里面点击角色,添加角色  2、没说的,点下一步 3、在弹出的方框里勾先WEB服务器(IIS)4、继续点击下一步5、接下来,它会出现IIS需要安装的一些必要组件,我在这里就将“应用程序开发”和安全性......
  • 2023 年(第十五届)四川省大学生程序设计大赛
    题目链接因为都是有官方题解的,咱这个蒟蒻就在记录一下赛时通过以及后来补得一些题......
  • 2023 年上海市大学生程序设计竞赛 - 五月赛A,B,C
    A.选择多造几组数据可以发现​\(dp[n]=dp[n/2]+1\).假如一个序列为\(\{1,2,\cdots,n\}\),那我们从\(n/2\)后都减去\(n/2\),序列就变为了\(\{1,2,\cdots,n/2,1,2,\cdots,n/2\}\),那么我们只需要\(n/2\)时次数最少得方案......
  • 复旦大学2022--2023学年第二学期(22级)高等代数II期末考试第八大题解答
    八、(10分) 设$n$阶实方阵$A$满足$A^3=A$,证明: 若对任意的实列向量$x$,均有$x'A'Ax\leqx'x$,则$A$是实对称阵.证法一(几何证法) 将题目转换成几何语言:设$\varphi$是$n$维欧氏空间$V$上的线性算子,满足$\varphi^3=\varphi$,若对$V$中任一向量$v......
  • 华为云GaussDB入选“2022年数字技术融合创新应用解决方案”
    近日,在第六届数字中国建设峰会数字技术融合创新应用研讨会上,工业和信息化部网络安全产业发展中心(工业和信息化部信息中心)公布了2022年数字技术融合创新应用解决方案征集工作成果,华为云GaussDB金融交易型数据库解决方案入选“2022年数字技术融合创新应用解决方案(典型解决方案)”。数......
  • 2023年,软件测试趋于饱和,如何从功能测试进阶到自动化测试?
    功能测试转成自动化测试,答案就三个字:“靠学习”。学习自动化的方法无非是三种:一、靠培训在相对有氛围的学习环境中来学习自动化测试,这是一个较快学习的方法。二、靠自学自动化教程(下方有视频资源推荐)如果在职,不能全职学习,可以找一些自动化学习的视频,选择看视频学习,这也是一个不......
  • 【图论】【建模】IOI2016 railroad
    【图论】【建模】IOI2016railroad题目描述Anna在一个游乐园工作。她负责建造一个新的过山车铁路。她已经设计了影响过山车速度的\(n\)个特殊的路段(方便起见标记为\(0\)到\(n-1\))。现在Anna必须要把这些特殊的路段放在一起并提出一个过山车的最后设计。为了简化问题,你可......
  • 云原生周刊:HashiCorp Vault 1.14 发布 | 2023.6.26
    开源项目推荐HelmfileHelmfile是一个开源工具,使用Helmcharts简化复杂应用程序的部署。它提供了一种声明性的方式来定义Kubernetes资源的期望状态,并管理Helmreleases的安装、升级和删除。KubeVPNKubeVPN是一个基于Kubernetes的开源VPN解决方案,它提供了一种简单的......