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

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

read_csv


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

而后,您能够经过使用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'])spa

选择仅具备数字特征的子数据帧。指针

copy


若是您尚未据说过,这是一个重要的命令。若是执行如下命令:code

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发生变化。要解决这个问题,你可使用任何一种方法orm

df2 = df1.copy()

blog

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.ci

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

相关文章
相关标签/搜索