原作:风控猎人
整理:数据管道
归纳整理了一些工作中常用到的pandas使用技巧,方便更高效地实现数据分析。
1.计算变量缺失率
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
df = pd.read_csv( 'titanic_train.csv' ) def missing_cal(df): """ df :数据集 return:每个变量的缺失率 """ missing_series = df.isnull(). sum () / df.shape[ 0 ] missing_df = pd.DataFrame(missing_series).reset_index() missing_df = missing_df.rename(columns = { 'index' : 'col' , 0 : 'missing_pct' }) missing_df = missing_df.sort_values( 'missing_pct' ,ascending = False ).reset_index(drop = True ) return missing_df missing_cal(df) |
如果需要计算样本的缺失率分布,只要加上参数axis=1.
2.获取分组里最大值所在的行方法
分为分组中有重复值和无重复值两种。无重复值的情况。
1
2
3
4
|
df = pd.DataFrame({ 'Sp' :[ 'a' , 'b' , 'c' , 'd' , 'e' , 'f' ], 'Mt' :[ 's1' , 's1' , 's2' , 's2' , 's2' , 's3' ], 'Value' :[ 1 , 2 , 3 , 4 , 5 , 6 ], 'Count' :[ 3 , 2 , 5 , 10 , 10 , 6 ]}) df df.iloc[df.groupby([ 'Mt' ]). apply ( lambda x: x[ 'Count' ].idxmax())] |
先按Mt列进行分组,然后对分组之后的数据框使用idxmax函数取出Count最大值所在的列,再用iloc位置索引将行取出。有重复值的情况
1
2
|
df[ "rank" ] = df.groupby( "ID" )[ "score" ].rank(method = "min" , ascending = False ).astype(np.int64) df[df[ "rank" ] = = 1 ][[ "ID" , "class" ]] |
对ID进行分组之后再对分数应用rank函数,分数相同的情况会赋予相同的排名,然后取出排名为1的数据。
3.多列合并为一行
1
2
3
4
|
df = pd.DataFrame({ 'id_part' :[ 'a' , 'b' , 'c' , 'd' ], 'pred' :[ 0.1 , 0.2 , 0.3 , 0.4 ], 'pred_class' :[ 'women' , 'man' , 'cat' , 'dog' ], 'v_id' :[ 'd1' , 'd2' , 'd3' , 'd1' ]}) df.groupby([ 'v_id' ]).agg({ 'pred_class' : [ ', ' .join], 'pred' : lambda x: list (x), 'id_part' : 'first' }).reset_index() |
4.删除包含特定字符串所在的行
1
2
|
df = pd.DataFrame({ 'a' :[ 1 , 2 , 3 , 4 ], 'b' :[ 's1' , 'exp_s2' , 's3' , 'exps4' ], 'c' :[ 5 , 6 , 7 , 8 ], 'd' :[ 3 , 2 , 5 , 10 ]}) df[df[ 'b' ]. str .contains( 'exp' )] |
5.组内排序
1
|
df = pd.DataFrame([[ 'A' , 1 ],[ 'A' , 3 ],[ 'A' , 2 ],[ 'B' , 5 ],[ 'B' , 9 ]], columns = [ 'name' , 'score' ]) |
介绍两种高效地组内排序的方法。
1
2
|
df.sort_values([ 'name' , 'score' ], ascending = [ True , False ]) df.groupby( 'name' ). apply ( lambda x: x.sort_values( 'score' , ascending = False )).reset_index(drop = True ) |
6.选择特定类型的列
1
2
3
4
5
6
7
8
|
drinks = pd.read_csv( 'data/drinks.csv' ) # 选择所有数值型的列 drinks.select_dtypes(include = [ 'number' ]).head() # 选择所有字符型的列 drinks.select_dtypes(include = [ 'object' ]).head() drinks.select_dtypes(include = [ 'number' , 'object' , 'category' , 'datetime' ]).head() # 用 exclude 关键字排除指定的数据类型 drinks.select_dtypes(exclude = [ 'number' ]).head() |
7.字符串转换为数值
1
2
3
4
5
|
df = pd.DataFrame({ '列1' :[ '1.1' , '2.2' , '3.3' ], '列2' :[ '4.4' , '5.5' , '6.6' ], '列3' :[ '7.7' , '8.8' , '-' ]}) df df.astype({ '列1' : 'float' , '列2' : 'float' }).dtypes |
用这种方式转换第三列会出错,因为这列里包含一个代表 0 的下划线,pandas 无法自动判断这个下划线。为了解决这个问题,可以使用 to_numeric() 函数来处理第三列,让 pandas 把任意无效输入转为 NaN。
1
|
df = df. apply (pd.to_numeric, errors = 'coerce' ).fillna( 0 ) |
8.优化 DataFrame 对内存的占用
方法一:只读取切实所需的列,使用usecols参数
1
2
|
cols = [ 'beer_servings' , 'continent' ] small_drinks = pd.read_csv( 'data/drinks.csv' , usecols = cols) |
方法二:把包含类别型数据的 object 列转换为 Category 数据类型,通过指定 dtype 参数实现。
1
2
|
dtypes = { 'continent' : 'category' } smaller_drinks = pd.read_csv( 'data/drinks.csv' ,usecols = cols, dtype = dtypes) |
9.根据最大的类别筛选 DataFrame
1
2
3
|
movies = pd.read_csv( 'data/imdb_1000.csv' ) counts = movies.genre.value_counts() movies[movies.genre.isin(counts.nlargest( 3 ).index)].head() |
10.把字符串分割为多列
1
2
3
4
|
df = pd.DataFrame({ '姓名' :[ '张 三' , '李 四' , '王 五' ], '所在地' :[ '北京-东城区' , '上海-黄浦区' , '广州-白云区' ]}) df df.姓名. str .split( ' ' , expand = True ) |
11.把 Series 里的列表转换为 DataFrame
1
2
3
4
5
|
df = pd.DataFrame({ '列1' :[ 'a' , 'b' , 'c' ], '列2' :[[ 10 , 20 ], [ 20 , 30 ], [ 30 , 40 ]]}) df df_new = df.列 2.apply (pd.Series) pd.concat([df,df_new], axis = 'columns' ) |
12.用多个函数聚合
1
2
|
orders = pd.read_csv( 'data/chipotle.tsv' , sep = '\t' ) orders.groupby( 'order_id' ).item_price.agg([ 'sum' , 'count' ]).head() |
13.分组聚合
1
2
3
4
5
6
7
8
9
10
11
12
|
import pandas as pd df = pd.DataFrame({ 'key1' :[ 'a' , 'a' , 'b' , 'b' , 'a' ], 'key2' :[ 'one' , 'two' , 'one' , 'two' , 'one' ], 'data1' :np.random.randn( 5 ), 'data2' :np.random.randn( 5 )}) df for name, group in df.groupby( 'key1' ): print (name) print (group) dict ( list (df.groupby( 'key1' ))) |
通过字典或Series进行分组
1
2
3
4
5
6
7
|
people = pd.DataFrame(np.random.randn( 5 , 5 ), columns = [ 'a' , 'b' , 'c' , 'd' , 'e' ], index = [ 'Joe' , 'Steve' , 'Wes' , 'Jim' , 'Travis' ]) mapping = { 'a' : 'red' , 'b' : 'red' , 'c' : 'blue' , 'd' : 'blue' , 'e' : 'red' , 'f' : 'orange' } by_column = people.groupby(mapping, axis = 1 ) by_column. sum () |
以上就是13个Pandas实用技巧,助你提高开发效率的详细内容,更多关于Pandas实用技巧的资料请关注服务器之家其它相关文章!
原文链接:https://cloud.tencent.com/developer/article/1648584