10个提高工作效率的Pandas小技巧,竟然可以这么用!

标星★公众号      爱你们

近期原创文章:

♥  5种机器学习算法在预测股价的应用(代码+数据)

♥  Two Sigma用新闻来预测股价走势,带你吊打Kaggle

 2万字干货: 利用深度学习最新前沿预测股价走势

♥  机器学习在量化金融领域的误用!

♥  基于RNN和LSTM的股市预测方法

♥  如何鉴别那些用深度学习预测股价的花哨模型?

♥  优化强化学习Q-learning算法进行股市

♥  WorldQuant 101 Alpha、国泰君安 191 Alpha

♥  基于回声状态网络预测股票价格(附代码)

♥  计量经济学应用投资失败的7个原因

♥  配对交易千千万,强化学习最NB!(文档+代码)

♥  关于高盛在Github开源背后的真相!

♥  新一代量化带货王诞生!Oh My God!

♥  独家!关于定量/交易求职分享(附真实试题)

♥  Quant们的身份危机!

♥  拿起Python,防御特朗普的Twitter

♥  AQR最新研究 | 机器能“学习”金融吗?

有些命令你可能已经知道,但可能不知道它们竟然可以这样使用!

今天为大家介绍10个Pandas小技巧,希望对你在平时的学习和工作中有所帮助。

read_csv

每个人都知道这个命令。 但当你读取的数据量很大时 ,请尝试添加这个参数: nrows = 5 ,以便在实际加载整个表之前只读取表的一小部分。然后,你可以通过选择错误的分隔符来避免这个错误(可能并不总以逗号分隔)。

或者,你可以在linux中使用'head'命令检查任何文本文件的前5行。比如: head -c 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()

要了解dataframe的所有数据类型,请执行以下操作:

df.select_dtypes(include = ['float64','int64'])

选择只有数字特征的子dataframe。

如果你还没有听说过这个命令,那么 这是一个非常重要的命令 。如果你执行:

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)

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

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

如果我们想 创建一个新列 ,其中 包含其他列内容作为输入 ,那么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.show()

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

apply有时会比较慢 。如果你想计算两列的最大值“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) ,而不是使用apply函数。

value_counts

这是一个 查看值分布的命令 。例如,如果你想查看“c”列中每个单独值的可能值和频率,你可以这样写:

df['c'].value_counts()

这里有一些有用的技巧/参数:

  • normalize = True: 如果你想查看频率而不是计数。

  • dropna = False: 如果你还想在统计中包含缺失值。

  • sort = False: 按值而不是按计数排序的统计结果。

  • df[‘c].value_counts().reset_index() :如果你想将stats表转换为pandas dataframe并对其进行操作。

缺失值数量

在构建模型时,你可能想要排除具有太多缺失值的行等。你可以使用 .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()

选择具有特定ID的行

在SQL中,我们可以使用  SELECT * FROM … WHERE ID in  ('A001', 'C022', …) 来获取具有特定ID的记录。如果你想用Pandas做同样的事情,你可以这样写:

df_filter = df['ID'].isin(['A001','C022',...])
df[df_filter]

百分位组

你有一个列数,并希望 将该列中的值分类为几组 。比如前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]

运行速度很快(没有使用apply函数)。

这也是每个人都会使用的命令。我们在这里指出两个技巧。第一个是:

print(df[:5].to_csv())

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

另一个技巧是:

处理混合在一起的整数和缺失值 。如果一个列同时包含缺失值和整数,那么数据类型仍然是float而不是int。导出表时,你可以添加 float_format='%.0f'  ,将所有浮点数化为整数。 如果你只想要所有列的整数输出,请使用此技巧。

作者:Shiu-Tang Li

—End—

量化投资与机器学习微信公众号,是业内垂直于 Quant MFE CST、AI 等专业的 流量化自媒体 。公众号拥有来自 公募、私募、券商、银行、海外 等众多圈内 10W+ 关注者。每日发布行业前沿研究成果和最新量化资讯。

你点的每个“在看”,我都认真当成了喜欢

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章