10招!看骨灰级Pythoner如何玩转Python

发表于:2019-4-15 13:01  作者:读芯术   来源:读芯术

字体: | 上一篇 | 下一篇 |我要投稿 | 推荐标签: Python

  pandas是基于numpy构建的,使数据分析工作变得更快更简单的高级数据结构和操作工具。本文为大家带来10个玩转Python的小技巧,学会了分分钟通关变大神!
  
  1. read_csv
  每个人都知道这个命令。但如果你要读取很大的数据,尝试添加这个参数:nrows = 5,以便在实际加载整个表之前仅读取表的一小部分。然后你可以通过选择错误的分隔符来避免错误(它不一定总是以逗号分隔)。
  (或者,你可以在linux中使用'head'命令来检查任何文本文件中的前5行,例如:head -c 5 data.txt)
  然后,你可以使用df.columns.tolist()来提取列表中的所有列,然后添加usecols = ['c1','c2',...]参数以加载所需的列。此外,如果你知道几个特定列的数据类型,则可以添加参数dtype = {'c1':str,'c2':int,...},以便数据加载得更快。此参数还有另一个优点,如果你有一个同时包含字符串和数字的列,那么将其类型声明为字符串是一个好选择,这样就可以在尝试使用此列作为键去合并表时不会出错。
  2. select_dtypes
  如果必须在Python中进行数据预处理,那么这个命令可以节约一些时间。读取表后,每列的默认数据类型可以是bool,int64,float64,object,category,timedelta64或datetime64。你可以先查看
  df.dtypes.value_counts()
  命令分发的结果以了解数据帧的所有可能数据类型,然后执行
  df.select_dtypes(include = ['float64','int64'])
  选择仅具有数字特征的子数据帧。
  3. 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()
  br
  或者
   from copy import deepcopy
  df2 = deepcopy(df1)
  4. Map
  这是一个可以进行简单数据转换的命令。首先定义一个字典,其中'keys'是旧值,'values'是新值。
  level_map = {1: ‘high’, 2: ‘medium’, 3: ‘low’}
  df[‘c_level’] = df[‘c’].map(level_map)
  举几个例子:True,False为1,0(用于建模); 定义水平; 用户定义的词法编码。
  5. 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'。
  但“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函数:
 df.apply(lambda x: round(x['c'], 0), axis = 1)
  6. value counts
  这是一个检查值分布的命令。例如,如果你想检查“c”列中每个值的可能值和频率,可以执行以下操作
 df[‘c’].value_counts()
  它有一些有用的技巧/参数:
   A. normalize = True:如果你要检查频率而不是计数。
  B. dropna = False:如果你要统计数据中包含的缺失值。
  C. df['c'].value_counts().reset_index():  如果你想将stats表转换成pandas数据帧并进行操作。
  D. df['c'].value_counts().reset_index().sort_values(by='index') : 显示按值而不是按计数排序的统计数据。
  7. 缺失值的数量
  构建模型时,你可能希望排除具有很多缺失值或全是缺失值的行。你可以使用.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]})
  dfdf = df[[‘id’, ‘c1’, ‘c2’]]
  df[‘num_nulls’] = df[[‘c1’, ‘c2’]].isnull().sum(axis=1)
  df.head()
  8. 选择具有特定ID的行
  在SQL中,我们可以使用SELECT * FROM ... WHERE ID('A001','C022',...)来获取具有特定ID的记录。如果想用Pandas做同样的事情,你可以
   dfdf_filter = df[‘ID’].isin([‘A001’,‘C022’,...])
  df[df_filter]
  9. 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]
  这个指令使计算机运行的非常快(没有使用应用功能)。
  10. to_csv
  这也是每个人都会使用的命令。这里指出两个技巧。 第一个是
 print(df[:5].to_csv())
  你可以使用此命令准确地打印出写入文件的前五行数据。
  另一个技巧是处理混合在一起的整数和缺失值。如果列同时包含缺失值和整数,则数据类型仍将是float而不是int。导出表时,可以添加float_format ='%。0f'将所有浮点数舍入为整数。如果只想要所有列的整数输出,请使用此技巧,你将摆脱所有令人苦恼的'.0'。

     上文内容不用于商业目的,如涉及知识产权问题,请权利人联系博为峰小编(021-64471599-8017),我们将立即处理。

>>每天充电一小时,搞定Python全栈测试开发

评 论

论坛新帖

顶部 底部


建议使用IE 6.0以上浏览器,800×600以上分辨率,法律顾问:上海瀛东律师事务所 张楠律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2019, 沪ICP备05003035号
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪公网安备 31010102002173号

51Testing官方微信

51Testing官方微博

扫一扫 测试知识全知道