Wind 旗下高端量化云平台
www.windquant.com
有些命令你可能已经知道,但可能不知道它们竟然可以这样使用!
今天为大家介绍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。
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)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.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函数)。
to_csv
这也是每个人都会使用的命令。我们在这里指出两个技巧。第一个是:
print(df[:5].to_csv())你可以使用此命令准确地打印出写入文件的前五行。
另一个技巧是:
处理混合在一起的整数和缺失值。如果一个列同时包含缺失值和整数,那么数据类型仍然是float而不是int。导出表时,你可以添加 float_format='%.0f' ,将所有浮点数化为整数。如果你只想要所有列的整数输出,请使用此技巧。
作者:Shiu-Tang Li
—End—
全网用户均可登录网页版
www.windquant.com
Wind数据免费使用
有Wind账号的朋友登录Wind金融终端
点击量化或输入WQT即可使用万矿
iWind群:463249 QQ群:877905186