Pandas库的基本操作(二)

数据抽取

字段拆分

对字符串类型的处理

slice() 函数:实现字符串的切片

split() 函数:按分隔符拆分字符串

df1 = pd.read_csv(r'/.../str_op2.csv')
df1['name'].str.split(n = 1, expand = True) # 默认分隔符为空格 分隔数量为所有 结果为列表 若expand = True则结果为DataFrame

 

str_op2.csv

 时间型数据列的处理

df2 = pd.read_csv(r'/.../dt_op.csv')
df2['date'] = pd.to_datetime(df2['注册时间'])
df2['date_year'] = df2['date'].dt.year # 从时间类型数据中,抽取出如年、月、日等数据属性
df2['date_month'] = df2['date'].dt.month
df2['date_day'] = df2['date'].dt.day
print(df2.head())
             电话                注册时间 是否微信  ... date_year  date_month  date_day
0  166412894295   2011/1/1 12:13:24    否  ...      2011           1         1
1  135416795207    2012/2/3 1:15:38    否  ...      2012           2         3
2  177423353436   2013/3/2 13:54:55    是  ...      2013           3         2
3  189424978309  2014/4/11 11:00:03    是  ...      2014           4        11
4  134450811715  2015/5/18 10:02:23    否  ...      2015           5        18

记录抽取

dIndex = df1['name'].str.contains('华为', na = False) # 本质上是使用布尔数组来抽取
print(df1[dIndex])
                 name
1  华为 MediaPad 7Vogue
3     华为(HUAWEI) 荣耀X1

关于na参数:'na参数用来控制原来series中有空值时,如何匹配。如果na=False,那空值就当作不匹配,返回False。na=True,那空值就当匹配上了,返回True。使用默认值,空值还是原样返回(保持空值)'

 随机抽样

df3 = pd.read_csv(r'/.../sample_data.csv')
print(df3)
   ID  姓名   消费
0   1  刘一  256
1   2  陈二  239
2   3  张三  282
3   4  李四  245
4   5  王五  162
5   6  赵六  295
6   7  孙七  173
7   8  周八  197
8   9  吴九  236
9  10  郑十  311

print(df3.sample(n=7,replace=True)) # 放回抽样
   ID  姓名   消费
8   9  吴九  236
2   3  张三  282
7   8  周八  197
9  10  郑十  311
9  10  郑十  311
3   4  李四  245
3   4  李四  245

print(df3.sample(frac=0.5,replace=False)) # 按百分比不放回抽样(个数或者百分比只能选一个)
   ID  姓名   消费
8   9  吴九  236
2   3  张三  282
4   5  王五  162
7   8  周八  197
9  10  郑十  311

多表数据合并

concat() 函数

几种链接方法

df_apple = pd.read_csv(r'/.../apple.csv')
df_apple_tmp = df_apple['title'].str.split(n=1,expand=True)
df_apple_tmp.columns = ['品牌','产品名称']
df_mi = pd.read_csv(r'/.../mi.csv')
df_mi_tmp = df_mi['title'].str.split(n=1,expand=True)
df_mi_tmp.columns = ['品牌','产品名称']

df = pd.concat([df_apple_tmp,df_mi_tmp[1:]]) # concat是pandas库的全局函数 默认axis=0按行(在下方)合并 默认join='outer'外链接 没有元素则置为空

print(df)
       品牌        产品名称
0   Apple    iPad Air
1   Apple   iPad mini
2   Apple    iPhone 7
3   Apple    iPhone X
4   Apple  iPad Air 2
1  小米(MI)       MIX 2
2  小米(MI)         MAX
3  小米(MI)       MAX 2
4  小米(MI)           7

print(pd.concat([df_apple_tmp,df_mi_tmp[1:]],axis=1,join='inner')) # axis=1按列合并 join=inner内链接 只包含[索引号]相同的
      品牌        产品名称      品牌   产品名称
1  Apple   iPad mini  小米(MI)  MIX 2
2  Apple    iPhone 7  小米(MI)    MAX
3  Apple    iPhone X  小米(MI)  MAX 2
4  Apple  iPad Air 2  小米(MI)      7

merge()函数

几种链接方法

df_name = pd.read_csv(r'/.../product_name.csv')
df_price = pd.read_csv(r'/.../product_price.csv')

 product_name.csv

 product_price.csv

df_i = pd.merge(df_name,df_price,left_on='id',right_on='id',how='inner') # 以id关联 内链接

df_o = pd.merge(df_name,df_price,left_on='id',right_on='id',how='outer') # 外链接 关联项的域不同

df_l = pd.merge(df_name,df_price,left_on='id',right_on='id',how='left') # 左链接 以左边表的关联列链接

 

df_r = pd.merge(df_name,df_price,left_on='id',right_on='id',how='right') # 右链接 以右边表的关联列链接

数据分组

连续型数据分组

将连续型(数值型)数据进行等距或非等距的分组,这个过程也称为数据离散化

cut_data.csv 

df1 = pd.read_csv(r'/.../cut_data.csv')
bins = [0,20,40,60,80,100,120] # 用于指定分组的列表

print(pd.cut(df1['cost'],bins=bins))  # 参数right分组区间右边是否封闭,默认封闭
0       (0, 20]
1       (0, 20]
2      (60, 80]
3       (0, 20]
4     (80, 100]
5       (0, 20]
6     (80, 100]
7      (60, 80]
8       (0, 20]
9      (40, 60]
10     (20, 40]
11      (0, 20]
12     (60, 80]
13    (80, 100]
14      (0, 20]
Name: cost, dtype: category
Categories (6, interval[int64]): [(0, 20] < (20, 40] < (40, 60] < (60, 80] < (80, 100] < (100, 120]]

clabels = ['A','B','C','D','E','F'] # 分组后每组的自定义标签,可不自定义
print(pd.cut(df1['cost'],bins=bins,labels=clabels))
0     A
1     A
2     D
3     A
4     E
5     A
6     E
7     D
8     A
9     C
10    B
11    A
12    D
13    E
14    A
Name: cost, dtype: category
Categories (6, object): ['A' < 'B' < 'C' < 'D' < 'E' < 'F']

离散型数据分组

gb_data.csv 

df2 = pd.read_csv(r'/.../gb_data.csv')
gb_data = df2.groupby('Gender')
print(gb_data) # 分组结果是对象
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7f7b90e0a6a0>

print(gb_data.groups) # groups属性可以获取到具体分组情况
{'Female': [2, 4, 7], 'Male': [0, 1, 3, 5, 6]}

print(gb_data.get_group('Female')) # 以DataFrame形式返回某一具体分组
    Name  Gender  Age  Score
2   Cidy  Female   18     93
4  Ellen  Female   17     96
7   Hebe  Female   22     98

分组数据统计 

gb_data.describe() # 返回每个分组可计算的详细统计数据

print(gb_data.min()) # 也可以使用这些计算方法
        Name  Age  Score
Gender                  
Female  Cidy   17     93
Male     Bob   18     80

print(gb_data.mean())
         Age      Score
Gender                 
Female  19.0  95.666667
Male    19.6  89.000000

print(gb_data.sum())
        Age  Score
Gender            
Female   57    287
Male     98    445
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Kentos(acoustic ver.)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值