资讯专栏INFORMATION COLUMN

10个Python Pandas技巧,使您的工作更有效率

stormjun / 3162人阅读

摘要:是一个广泛用于结构化数据的包。因此,的任何变化都会导致发生变化。这是检查值分布的命令。这也是每个人都会使用的命令。我想在这里指出两个技巧。另一个技巧是处理混合在一起的整数和缺失值。将所有浮点数舍入为整数。

Pandas是一个广泛用于结构化数据的Python包。本文将介绍一些读者可能以前不知道的很实用的技巧。

read_csv

每个人都知道这个命令。但是读取的数据很大,可以尝试添加这个参数:nrows = 5以便在实际加载整个表之前读取表的一小部分。然后你可以通过选择错误的分隔符来避免错误(它可能不总是以逗号分隔)。或者,您可以在linux中使用"head"命令检查任何文本文件中的前5行(比如说):head -n 5 data.txt

然后,您可以通过使用df.columns.tolist()提取所有列来提取列列表,然后添加usecols = ["c1","c2",...]参数来加载您需要的列。此外,如果您知道几个特定列的数据类型,则可以添加参数dtype = {"c1":str,"c2":int,...},以便加载更快。这个参数的另一个优点是,如果您有一个同时包含字符串和数字的列,那么将它的类型声明为string是一个很好的实践,这样在试图使用该列作为键合并表时就不会出现错误。

select_dtypes

如果数据预处理必须在Python中完成,那么这个命令可以节省你一些时间。读入表后,每列的默认数据类型可以是bool,int64,float64,object,category,timedelta64或datetime64。您可以先用df.dtypes.value_counts(),要了解数据帧的所有可能数据类型,然后执行df.select_dtypes(include=["float64", "int64"])

选择仅具有数字特征的子数据帧。

copy

如果您还没有听说过,这是一个重要的命令。如果执行以下命令:

import pandas as pd
df1 = pd.DataFrame({ "a":[0,0,0], "b": [1,1,1]})
df2 = df1
df2["a"] = df2["a"] + 1
df1.head()

你会发现df1已经改变了。这是因为df2 = df1没有复制df1并将其分配给df2,而是设置指向df1的指针。因此,df2的任何变化都会导致df1发生变化。要解决这个问题,你可以使用任何一种方法

df2 = df1.copy()

from copy import deepcopy
df2 = deepcopy(df1)
map

这个命令可以很容易的进行数据转换。首先定义一个字典,其中"keys"是旧值,"values"是新值。

level_map = {1: "high", 2: "medium", 3: "low"}
df["c_level"] = df["c"].map(level_map)

一些例子:True, False to 1, 0 (for modeling); defining levels; user defined lexical encodings.

apply or not apply?

如果我们想创建一个包含其他几列作为输入的新列,那么apply函数有时非常有用。

def rule(x, y):
    if x == "high" and y > 10:
         return 1
    else:
         return 0
df = pd.DataFrame({ "c1":[ "high" ,"high", "low", "low"], "c2": [0, 23, 17, 4]})
df["new"] = df.apply(lambda x: rule(x["c1"], x["c2"]), axis =  1)
df.head()

在上面的代码中,我们定义了一个带有两个输入变量的函数,并使用apply函数将它应用于列"c1"和"c2"。

“应用”的问题是它有时太慢了。如果你想计算两列“c1”和“c2”的最大值,你当然可以这样做

df["maximum"] = df.apply(lambda x: max(x["c1"], x["c2"]), axis = 1)

但你会发现它比这个命令慢得多:

df["maximum"] = df[["c1","c2"]].max(axis =1)

愿码提示:如果您可以使用其他内置函数完成相同的工作(它们通常更快),请不要使用apply。例如,如果要将列"c"舍入为整数,请执行round(df ["c"],0)或df ["c"]。round(0)而不是使用apply函数:df.apply(lambda x: round(x["c"], 0), axis = 1)。

value counts

这是检查值分布的命令。例如,如果您想检查“c”列中每个值的可能值和频率,您可以执行此操作:df["c"].value_counts()

还有就是它的一些有用的技巧/参数:
A. normalize = True:如果您想检查频率而不是计数。
B. dropna = False:如果您还想在统计中包含缺失的值。
C. df["c"].value_counts().reset_index():如果希望将stats表转换为panda数据aframe并对其进行操作。
D. df["c"].value_counts().reset_index().sort_values(by="index"):在"c"列中显示按不同值排序的统计信息,而不是count。

number of missing values

构建模型时,您可能希望排除具有太多缺失值的行/具有所有缺失值的行。您可以使用.isnull()和.sum()来计算指定列中缺失值的数量。

import pandas as pd
import numpy as np
df = pd.DataFrame({ "id": [1,2,3], "c1":[0,0,np.nan], "c2": [np.nan,1,1]})
df = df[["id", "c1", "c2"]]
df["num_nulls"] = df[["c1", "c2"]].isnull().sum(axis=1)
df.head()
select rows with specific IDs

在SQL中,我们可以使用SELECT * FROM ... WHERE ID("A001","C022",...)来获取具有特定ID的记录。如果你想用熊猫做同样的事情,你可以做到

df_filter = df["ID"].isin(["A001","C022",...])
df[df_filter]
Percentile groups

您有一个数字列,并希望将该列中的值分类为组,例如前5%进入组1,5-20%进入组2,20%-50%进入组3,将底部50%归入组4当然,你可以用pandas.cut来做,但我想在这里提供另一种选择:

import numpy as np
cut_points = [np.percentile(df["c"], i) for i in [50, 80, 95]]
df["group"] = 1
for i in range(3):
    df["group"] = df["group"] + (df["c"] < cut_points[i])
# or <= cut_points[i]

这是快速运行(没有使用应用功能)。

to_csv

这也是每个人都会使用的命令。我想在这里指出两个技巧。第一个是:print(df[:5].to_csv())

您可以使用此命令打印出准确写入文件的前五行。

另一个技巧是处理混合在一起的整数和缺失值。如果列包含缺失值和整数,则数据类型仍将是float而不是int。导出表时,可以添加float_format ="%。0f"将所有浮点数舍入为整数。如果您只想要所有列的整数输出,请使用此技巧 - 您将摆脱所有恼人的".0"。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/43761.html

相关文章

  • 15Python库,让你学习数据科学轻松

    摘要:在本节中,我们将看到一些最流行和最常用的库,用于机器学习和深度学习是用于数据挖掘,分析和机器学习的最流行的库。愿码提示网址是一个基于的框架,用于使用多个或进行有效的机器学习和深度学习。 showImg(https://segmentfault.com/img/remote/1460000018961827?w=999&h=562); 来源 | 愿码(ChainDesk.CN)内容编辑...

    W4n9Hu1 评论0 收藏0
  • [译]从列表或字典创建Pandas的DataFrame对象

    摘要:在这些情况下,了解如何从标准列表或字典创建会很有帮助。大多数人会注意到列的顺序看起来不对。这个问题出现的原因是标准的字典不保留其键的顺序。列表从创建的另一个选择是将数据包含在列表结构中。 介绍 每当我使用pandas进行分析时,我的第一个目标是使用众多可用选项中的一个将数据导入Pandas的DataFrame 。对于绝大多数情况下,我使用的 read_excel , read_csv ...

    zhaochunqi 评论0 收藏0
  • 忘记API 使用Beautiful Soup进行Python Scraping,从Web导入数据文件

    摘要:忘记使用进行,从导入数据文件第部分对于每个网站而言,并不总是适合您,但将永远与您保持联系以从任何网站收集任何类型的数据。非资源让我们拿一个维基百科页面进行报废。请求它旨在被人类用于与语言进行通信。使用标签,我们将告诉保护我们的数据。忘记API使用Beautiful Soup进行Python Scraping,从Web导入数据文件:第2部分 对于每个网站而言,API并不总是适合您,但Be...

    马龙驹 评论0 收藏0
  • 忘记API 使用Beautiful Soup进行Python Scraping,从Web导入数据文件

    摘要:忘记使用进行,从导入数据文件第部分对于每个网站而言,并不总是适合您,但将永远与您保持联系以从任何网站收集任何类型的数据。非资源让我们拿一个维基百科页面进行报废。请求它旨在被人类用于与语言进行通信。使用标签,我们将告诉保护我们的数据。忘记API使用Beautiful Soup进行Python Scraping,从Web导入数据文件:第2部分 对于每个网站而言,API并不总是适合您,但Be...

    wayneli 评论0 收藏0
  • 收藏 | 10可以快速用Python进行数据分析的小技巧

    摘要:函数将单元格内容以形式呈现。自动评论代码自动注释单元格中的选定行,再次命中组合将取消注释相同的代码行。如果需要恢复整个已删除的单元格,请按或撤消删除单元格。 showImg(https://segmentfault.com/img/remote/1460000019599210); 编译:小七、蒋宝尚 一些小提示和小技巧可能是非常有用的,特别是在编程领域。有时候使用一点点黑客技术,既可...

    silvertheo 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<