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

image
  • 来源 | 愿码(ChainDesk.CN)内容编辑
  • 愿码Slogan | 连接每个程序员的故事
  • 网站 | http://chaindesk.cn
  • 愿码愿景 | 打造全学科IT系统免费课程,助力小白用户、初级工程师0成本免费系统学习、低成本进阶,帮助BAT一线资深工程师成长并利用自身优势创造睡后收入。
  • 官方公众号 | 愿码 | 愿码服务号 | 区块链部落
  • 免费加入愿码全思维工程师社群 | 任一公众号回复“愿码”两个字获取入群二维码

本文阅读时长:8min

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'。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容