python里的df_10招!看骨灰级Pythoner如何玩转Python

原标题:10招!看骨灰级Pythoner如何玩转Python

b05bb187b81c44f1b64a368a6fe2b8c9.jpeg

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。你可以先查看

1df.dtypes.value_counts

2# 命令分发的结果以了解数据帧的所有可能数据类型,然后执

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

选择仅具有数字特征的子数据帧。

3. Copy

这是一个重要的命令。如果执行以下命令:

1importpandas aspd

2df1 = pd.DataFrame({ ‘a’:[ 0, 0, 0], ‘b’: [ 1, 1, 1]})

3df2 = df1

4df2[‘a’] = df2[‘a’] + 1

5df1.head

你会发现df1已经改变了。这是因为df2 = df1没有复制df1的值并将其分配给df2,而是设置指向df1的指针。因此,df2的任何变化都会导致df1发生变化 要解决这个问题,你可以:

1df2 = df1.copy

2# 或者

3fromcopy importdeepcopy

4df2 = deepcopy(df1)

4. Map

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

1level_map = { 1: ‘high’, 2: ‘medium’, 3: ‘low’}

2df[‘c_level’] = df[‘c’].map(level_map)

举几个例子:True,False为1,0(用于建模); 定义水平; 用户定义的词法编码。

5. apply or not apply?

如果我们想创建一个新的列,并将其他列作为输入,那么apply函数有时非常有用。

1defrule(x, y):

2ifx == ‘high’ andy > 10:

3return1

4else:

5return0

6df = pd.DataFrame({ c1 :[ high , high , low , low ], c2 : [ 0, 23, 17, 4]})

7df[ new ] = df.apply( lambdax: rule(x[ c1 ], x[ c2 ]), axis = 1)

8df.head

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

但“apply函数”的问题是它有时太慢了。 如果你想计算两列“c1”和“c2”的最大值,你可以:

1df[‘maximum’] = df.apply( lambdax: max(x[‘c1’], x[‘c2’]), axis = 1)

2# 但你会发现它比这个命令慢得多:

3df[‘maximum’] = df[[‘c1’,’c2 ]].max(axis = 1)

注意:如果可以使用其他内置函数完成相同的工作(它们通常更快),请不要使用apply。例如,如果要将列 c 舍入为整数,请执行round(df [ c ],0)而非使用apply函数:

1df.apply( lambdax: round(x[ c ], 0), axis = 1)

6. value counts

这是一个检查值分布的命令。例如,如果你想检查“c”列中每个值的可能值和频率,可以执行以下操作

1df[‘c’].value_counts

2# 它有一些有用的技巧/参数:

3normalize = True#如果你要检查频率而不是计数。

4dropna = False#如果你要统计数据中包含的缺失值。

5df[ c ].value_counts.reset_index #如果你想将stats表转换成pandas数据帧并进行操作。

6df[ c ].value_counts.reset_index.sort_values(by= index ) #显示按值而不是按计数排序的统计数据。

7. 缺失值的数量

构建模型时,你可能希望排除具有很多缺失值或全是缺失值的行。你可以使用.isnull和.sum来计算指定列中缺失值的数量。

1importpandas aspd

2importnumpy asnp

3df = pd.DataFrame({ ‘id’: [ 1, 2, 3], ‘c1’:[ 0, 0,np.nan], ‘c2’: [np.nan, 1, 1]})

4df = df[[‘id’, ‘c1’, ‘c2’]]

5df[‘num_nulls’] = df[[‘c1’, ‘c2’]].isnull.sum(axis= 1)

6df.head

8. 选择具有特定ID的行

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

1df_filter = df[‘ID’].isin([‘A001’,‘C022’,...])

2df[df_filter]

9. Percentile groups

你有一个数字列,并希望将该列中的值分类为组,例如将列的前5%,分为组1,前5-20%分为组2,前20%-50%分为组3,最后50%分为组4。当然,你可以用pandas.cut来做,但这里提供另一个选择:

1importnumpy asnp

2cut_points = [np.percentile(df[‘c’], i) fori in[ 50, 80, 95]]

3df[‘group’] = 1

4fori inrange( 3):

5df[‘group’] = df[‘group’] + (df[‘c’] < cut_points[i])

6# or <= cut_points[i]

这个指令使计算机运行的非常快(没有使用应用功能)。

10. to_csv

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

1print(df[: 5].to_csv)

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

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

为什么说精通 python 的人,天天摸鱼,还特么能薪资翻倍?

|Python公开课|返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值