Python | Pandas常用技巧

目录

read_csv

  • 如果你要读取的数据量很大时,你可以尝试使用一下这个参数:nrows = 5。
  • df.columns.tolist() 提取所有列,使用 usecols = [’ c1 ', ’ c2 ',…] 参数来加载所需的列
  • 如果你知道特定列的数据类型,还可以通过添加参数 dtype = {’ c1 ': str, ’ c2 ': int,…},这样加载速度会更快。
  • 其中上述第三点特别重要,因为如果同时存在包含字符串和数字的列,那么将类型作以声明是一个很好的方法,当使用该列作为 key 合并表时就不会出现错误。
import pandas as pd
df = pd.read_csv('./data/打分前20商户基本信息+打分.csv', encoding= 'gbk',
                nrows = 5)
df
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO BUS_LIC_NO CRP_ID_NO LEGAL_AREA LEGAL_SEX LEGAL_AGE ... score_cnt_3_6 score_cnt_6_12 score_day_bf_m6 score_year_bf score_fail_cnt_per score_fail_amt_per score_ow_cnt_per_m3 stable_score grow_score final_score
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11 91310115***E641 47DC90091B6BBE476E78E5D5AA1A9F3B 510213 37 ... 66.490134 100 79.734951 91.149570 99.500649 99.437362 100.000000 83.772512 88.644849 95.650519
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11 35010260***3292 8E5E44B72135FE97C190E6EBF6BF9DDA 350121 46 ... 70.229582 100 71.096137 72.676023 98.277708 97.254613 94.314502 81.791015 89.871021 95.545835
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11 91430211***0968 21EB44C8A0D2FC3ED5FF17457F2C8021 430202 32 ... 74.732512 100 68.917341 76.515809 95.516478 90.725373 100.000000 84.666181 93.099689 96.664641
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11 91410104***9496 1D29F6A6EEEE7147BBA0B500A41134FD 410402 53 ... 71.365266 100 57.732148 76.375912 96.733301 93.707047 100.000000 84.586050 92.185113 96.573539
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11 91310116***5552 E63E2E63D5399EF2BA7C28F4E3D720C7 332502 41 ... 64.289203 100 76.493775 85.980428 94.189257 93.225704 100.000000 84.829916 90.689888 96.134069

5 rows × 44 columns

df_col = df.columns.tolist()
df_col
['MERC_ID',
 'SUP_MCC_NM',
 'MCC_NM',
 'STL_OAC',
 'WC_LBNK_NO',
 'BUS_LIC_NO',
 'CRP_ID_NO',
 'LEGAL_AREA',
 'LEGAL_SEX',
 'LEGAL_AGE',
 'CRP_PHONE',
 'STOE_ID',
 'STOE_CNT_TEL',
 'SIG_DT',
 'BUS_EXP_DT',
 '行业',
 'score_SIG_DT',
 'score_act_per_m12',
 'score_act_per_m3',
 'score_act_per_m6',
 'score_amt_1_3',
 'score_amt_3_6',
 'score_amt_6_12',
 'score_amt_active_day_m12',
 'score_amt_active_day_m3',
 'score_amt_active_day_m6',
 'score_amt_m1',
 'score_amt_m12',
 'score_amt_m3',
 'score_amt_m6',
 'score_amt_single_1_3',
 'score_amt_single_3_6',
 'score_amt_single_6_12',
 'score_cnt_1_3',
 'score_cnt_3_6',
 'score_cnt_6_12',
 'score_day_bf_m6',
 'score_year_bf',
 'score_fail_cnt_per',
 'score_fail_amt_per',
 'score_ow_cnt_per_m3',
 'stable_score',
 'grow_score',
 'final_score']
df_ = pd.read_csv('./data/打分前20商户基本信息+打分.csv', encoding= 'gbk', usecols=df_col[:5])
df_
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11
5 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11
6 8.002900e+14 一般类 百货商店 622848****8747 1.032900e+11
7 8.003050e+14 一般类 各类服装及饰物店 621691****2716 3.053050e+11
8 8.003050e+14 一般类 百货商店 622848****0611 1.033050e+11
9 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11
10 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11
11 8.005880e+14 一般类 百货商店 622848****1291 1.035880e+11
12 8.007130e+14 一般类 未列入其他代码的商业服务 623094****6704 1.057140e+11
13 8.004910e+14 餐娱类 就餐场所和餐馆 622908****3831 3.094910e+11
14 8.005530e+14 一般类 成人成衣店 622848****8717 1.035580e+11
15 8.001730e+14 餐娱类 就餐场所和餐馆 621798****2745 4.031730e+11
16 8.004920e+14 一般类 家庭服装商店 621786****6762 1.044910e+11
17 8.005810e+14 一般类 成人成衣店 622846****0817 1.035810e+11
18 8.005810e+14 餐娱类 就餐场所和餐馆 621491****2576 3.035810e+11
19 8.002900e+14 餐娱类 就餐场所和餐馆 436462****5998 1.042900e+11

select_dtypes

import pandas as pd
df.dtypes.value_counts()
float64    24
int64      11
object      9
dtype: int64
df.select_dtypes(include=['int64'])
LEGAL_AREA LEGAL_AGE SIG_DT BUS_EXP_DT score_amt_1_3 score_amt_6_12 score_amt_m1 score_amt_single_1_3 score_amt_single_6_12 score_cnt_1_3 score_cnt_6_12
0 510213 37 20170426 20460124 100 100 100 100 100 100 100
1 350121 46 20170522 20250522 100 100 100 100 100 100 100
2 430202 32 20170620 99991231 100 100 100 100 100 100 100
3 410402 53 20170801 20220613 100 100 100 100 100 100 100
4 332502 41 20170809 20220610 100 100 100 100 100 100 100

copy

详情见Python中三种copy

map函数

总结:

  • 特别好用 经常对DataFrame的一列使用map函数
  • 其中map里面既可以是函数 也可以是一个字典
df
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO BUS_LIC_NO CRP_ID_NO LEGAL_AREA LEGAL_SEX LEGAL_AGE ... score_cnt_3_6 score_cnt_6_12 score_day_bf_m6 score_year_bf score_fail_cnt_per score_fail_amt_per score_ow_cnt_per_m3 stable_score grow_score final_score
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11 91310115***E641 47DC90091B6BBE476E78E5D5AA1A9F3B 510213 37 ... 66.490134 100 79.734951 91.149570 99.500649 99.437362 100.000000 83.772512 88.644849 95.650519
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11 35010260***3292 8E5E44B72135FE97C190E6EBF6BF9DDA 350121 46 ... 70.229582 100 71.096137 72.676023 98.277708 97.254613 94.314502 81.791015 89.871021 95.545835
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11 91430211***0968 21EB44C8A0D2FC3ED5FF17457F2C8021 430202 32 ... 74.732512 100 68.917341 76.515809 95.516478 90.725373 100.000000 84.666181 93.099689 96.664641
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11 91410104***9496 1D29F6A6EEEE7147BBA0B500A41134FD 410402 53 ... 71.365266 100 57.732148 76.375912 96.733301 93.707047 100.000000 84.586050 92.185113 96.573539
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11 91310116***5552 E63E2E63D5399EF2BA7C28F4E3D720C7 332502 41 ... 64.289203 100 76.493775 85.980428 94.189257 93.225704 100.000000 84.829916 90.689888 96.134069

5 rows × 44 columns

需求:

  • 对SUP_MCC_NM这一列 将餐娱类变成1 一般类变成2
level_map = {'餐娱类': 1, '一般类': 2}
df['ind_level'] = df['SUP_MCC_NM'].map(level_map)
df.head()
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO BUS_LIC_NO CRP_ID_NO LEGAL_AREA LEGAL_SEX LEGAL_AGE ... score_cnt_6_12 score_day_bf_m6 score_year_bf score_fail_cnt_per score_fail_amt_per score_ow_cnt_per_m3 stable_score grow_score final_score ind_level
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11 91310115***E641 47DC90091B6BBE476E78E5D5AA1A9F3B 510213 37 ... 100 79.734951 91.149570 99.500649 99.437362 100.000000 83.772512 88.644849 95.650519 1
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11 35010260***3292 8E5E44B72135FE97C190E6EBF6BF9DDA 350121 46 ... 100 71.096137 72.676023 98.277708 97.254613 94.314502 81.791015 89.871021 95.545835 1
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11 91430211***0968 21EB44C8A0D2FC3ED5FF17457F2C8021 430202 32 ... 100 68.917341 76.515809 95.516478 90.725373 100.000000 84.666181 93.099689 96.664641 1
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11 91410104***9496 1D29F6A6EEEE7147BBA0B500A41134FD 410402 53 ... 100 57.732148 76.375912 96.733301 93.707047 100.000000 84.586050 92.185113 96.573539 2
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11 91310116***5552 E63E2E63D5399EF2BA7C28F4E3D720C7 332502 41 ... 100 76.493775 85.980428 94.189257 93.225704 100.000000 84.829916 90.689888 96.134069 2

5 rows × 45 columns

apply

总结:

  • 用的也特别多 速度比较快 特别是分组计算的时候
  • 也可以在新产生一列 也可以用apply
  • 但是如果Python有内置函数 就不要用apply了 内置函数更快

需求:

  • 比如现在想要统计score_day_bf_m6和score_year_bf的最大值 并产生一个新列

方式1

df['max_num'] = df.apply(lambda x: max(x['score_day_bf_m6'], x['score_year_bf']), axis=1)
df.head()
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO BUS_LIC_NO CRP_ID_NO LEGAL_AREA LEGAL_SEX LEGAL_AGE ... score_day_bf_m6 score_year_bf score_fail_cnt_per score_fail_amt_per score_ow_cnt_per_m3 stable_score grow_score final_score ind_level max_num
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11 91310115***E641 47DC90091B6BBE476E78E5D5AA1A9F3B 510213 37 ... 79.734951 91.149570 99.500649 99.437362 100.000000 83.772512 88.644849 95.650519 1 91.149570
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11 35010260***3292 8E5E44B72135FE97C190E6EBF6BF9DDA 350121 46 ... 71.096137 72.676023 98.277708 97.254613 94.314502 81.791015 89.871021 95.545835 1 72.676023
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11 91430211***0968 21EB44C8A0D2FC3ED5FF17457F2C8021 430202 32 ... 68.917341 76.515809 95.516478 90.725373 100.000000 84.666181 93.099689 96.664641 1 76.515809
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11 91410104***9496 1D29F6A6EEEE7147BBA0B500A41134FD 410402 53 ... 57.732148 76.375912 96.733301 93.707047 100.000000 84.586050 92.185113 96.573539 2 76.375912
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11 91310116***5552 E63E2E63D5399EF2BA7C28F4E3D720C7 332502 41 ... 76.493775 85.980428 94.189257 93.225704 100.000000 84.829916 90.689888 96.134069 2 85.980428

5 rows × 46 columns

方式2

df['max_num'] = df[['score_day_bf_m6','score_year_bf']].max(axis=1)
df.head()
MERC_ID SUP_MCC_NM MCC_NM STL_OAC WC_LBNK_NO BUS_LIC_NO CRP_ID_NO LEGAL_AREA LEGAL_SEX LEGAL_AGE ... score_day_bf_m6 score_year_bf score_fail_cnt_per score_fail_amt_per score_ow_cnt_per_m3 stable_score grow_score final_score ind_level max_num
0 8.002900e+14 餐娱类 就餐场所和餐馆 621226****1423 1.022900e+11 91310115***E641 47DC90091B6BBE476E78E5D5AA1A9F3B 510213 37 ... 79.734951 91.149570 99.500649 99.437362 100.000000 83.772512 88.644849 95.650519 1 91.149570
1 8.003910e+14 餐娱类 就餐场所和餐馆 621786****4862 1.043910e+11 35010260***3292 8E5E44B72135FE97C190E6EBF6BF9DDA 350121 46 ... 71.096137 72.676023 98.277708 97.254613 94.314502 81.791015 89.871021 95.545835 1 72.676023
2 8.005520e+14 餐娱类 就餐场所和餐馆 622202****6985 1.025520e+11 91430211***0968 21EB44C8A0D2FC3ED5FF17457F2C8021 430202 32 ... 68.917341 76.515809 95.516478 90.725373 100.000000 84.666181 93.099689 96.664641 1 76.515809
3 8.004910e+14 一般类 光学产品、眼镜店 621081****7341 1.054910e+11 91410104***9496 1D29F6A6EEEE7147BBA0B500A41134FD 410402 53 ... 57.732148 76.375912 96.733301 93.707047 100.000000 84.586050 92.185113 96.573539 2 76.375912
4 8.002900e+14 一般类 皮货店 622908****0571 3.092900e+11 91310116***5552 E63E2E63D5399EF2BA7C28F4E3D720C7 332502 41 ... 76.493775 85.980428 94.189257 93.225704 100.000000 84.829916 90.689888 96.134069 2 85.980428

5 rows × 46 columns

总结:第二种方式更好

round(df['final_score'], 0)
0    96.0
1    96.0
2    97.0
3    97.0
4    96.0
Name: final_score, dtype: float64

value counts

检查频数

df['SUP_MCC_NM'].value_counts()
餐娱类    3
一般类    2
Name: SUP_MCC_NM, dtype: int64

检查频率

df['SUP_MCC_NM'].value_counts(normalize = True)
餐娱类    0.6
一般类    0.4
Name: SUP_MCC_NM, dtype: float64

在统计中包含缺失值

df['SUP_MCC_NM'].value_counts(dropna = False)
餐娱类    3
一般类    2
Name: SUP_MCC_NM, dtype: int64

统计信息按值排序而不是按计数排序

df['SUP_MCC_NM'].value_counts(sort = False)
一般类    2
餐娱类    3
Name: SUP_MCC_NM, dtype: int64

转为DataFrame

df['SUP_MCC_NM'].value_counts().reset_index()
index SUP_MCC_NM
0 餐娱类 3
1 一般类 2

缺失值统计

见具体的缺失值统计的博客

选择特定id的列-即取值符合某个条件的列

使用isin函数

分组:按照百分比

cut函数

to_csv

今天遇到的坑:

  • 导出的名称里不能含有/ |
  • 可以有[] - _

技巧:

  • float_format=‘%.0f’
  • 用于处理整数值和空缺值混合在一起的情况。如果一列同时包含缺失值和整数值,那么写入的数据类型仍然是 float 而不是 int 型。在导出数据表时,可以通过添加 float_format=‘%.0f’ 将所有浮点数四舍五入为整数。如果希望所有列输出的都是整数,那么这个技巧也可以帮你摆脱烦人的 ‘.0’ 格式。

降序排列

df_sort = df.sort_values(by = 'max_num', ascending=0)  # 降序
df_sort['max_num']
0    91.149570
4    85.980428
2    76.515809
3    76.375912
1    72.676023
Name: max_num, dtype: float64

数据

猜你喜欢

转载自blog.csdn.net/qq_27782503/article/details/88768303