Python(数据分析篇)--- Pandas框架【三】进阶操作,分组函数,聚合函数,表格合并等

import numpy as np
import pandas as pd

一、时间模块处理

place_order_time = data['place_order_time'].astype('str')

1. 将字符串类型转成标准时间格式

data['place_order_time'] = pd.to_datetime(place_order_time)
print(data['place_order_time'].head())

输出:

0   2016-08-01 11:05:36
1   2016-08-01 11:07:07
2   2016-08-01 11:07:40
3   2016-08-01 11:11:11
4   2016-08-01 11:11:30
Name: place_order_time, dtype: datetime64[ns]

2. 时间类型提取

ser.dt常用时间属性:

year/month/day/hour/minute/second/date

data['year'] = data['place_order_time'].dt.year
data['place_order_time'].dt.week.head()  # 一年的第几周
0    31
1    31
2    31
3    31
4    31
Name: place_order_time, dtype: int64

3. 时间运算

(1)标准时间加减运算

time1 = data['place_order_time'].head()
# 两个时间表的索引不同时无法进行运算
time2 = data['place_order_time'].tail().reset_index()['place_order_time']  # 重置索引,但会生成新的一列来保留原来的索引,
print(time2-time1)
0   9 days 10:50:48
1   9 days 10:49:41
2   9 days 10:54:12
3   9 days 10:52:47
4   9 days 10:53:00
Name: place_order_time, dtype: timedelta64[ns]

(2)整体+时间戳

# 往后平移一天
data['place_order_time']+pd.Timedelta(days=1)
# 往后平移一小时
(data['place_order_time']+pd.Timedelta(hours=1)).head()
0   2016-08-01 12:05:36
1   2016-08-01 12:07:07
2   2016-08-01 12:07:40
3   2016-08-01 12:11:11
4   2016-08-01 12:11:30
Name: place_order_time, dtype: datetime64[ns]

二、分组函数

基本分组方法

groupby:分组函数 - 需要指定分组键

使用:表格名.groupby(分组键)[聚合键].聚合函数()

data.groupby('order_id')[['amounts','counts']].sum().sort_values(by='counts',ascending=False).head()

说明:

  1. sort_values把结果进行排序,二维需要指定按那一列排序,即by=’’,一维不需要指定
  2. ascending把排序结果倒序展示,False为倒序,True为正序,默认为True

分组后生成表:

amountscounts
order_id
55795730
118665528
114694427
1026102124
39270424

高级分组操作:透视表

参数说明:

  1. index:行分组键,分完组之后,分组键的取值在行索引的位置;
  2. aggfunc:聚合函数。对分组内容的值进行的操作,可以传入多个函数;
  3. values:指定对那几列进行聚合操作
  4. columns:列分组键,分完组之后,分组键的取值在列索引的位置;
  5. fill_value:将数据为Nan的值替换为对应的值;
  6. margins:表示汇总开关,False关闭,True开启,默认False,行列都汇总;
  7. margins_name:汇总的行列的索引名字,默认为‘All’
pd.pivot_table(data,index=['order_id'],aggfunc=[np.mean,np.sum],values=['amounts','counts']).head()

输出:

meansum
amountscountsamountscounts
order_id
13732.3333331.5000001949
16552.9444441.16666795321
16648.2000001.4000002417
17136.2857141.42857125410
17734.2500001.0000001374
pd.pivot_table(data,columns=['order_id'],index=['dishes_name'],aggfunc=[np.sum],values=['counts'],fill_value=0,margins=True).head()

添加maigin

sum
counts
order_id137165166171...All
dishes_name
42度海之蓝0.00.00.00.0...5.0
北冰洋汽水0.00.00.00.0...45.0
38度剑南春0.01.00.00.0...6.0
50度古井贡酒0.00.00.00.0...5.0
52度泸州老窖0.00.00.00.0...8.0

5 rows × 279 columns

麻烦分组:交叉表

一般不用

pd.crosstab(index=data['order_id'],columns=data['dishes_name'],values=data['counts'],aggfunc=[np.sum])

三、聚合函数

1、 基本方法

pandas/numpy中的统计分析方法(sum/mean/std/var…)都可以直接使用

2、 特殊函数完成聚合

# 对多列同时使用多个分析方法
data[['amounts','counts']].agg([np.sum,np.mean,np.std])
# 对不同列分别使用不同的分析方法
# data[['amounts','counts']].agg({'amounts':np.mean,'counts':np.sum})
data[['amounts','counts']].agg({'amounts':np.mean,'counts':[np.sum,np.std]})
data.groupby('order_id')[['amounts','counts']].agg([np.mean,np.sum]).head()

3、transform聚合方法:

在pandas或者numpy中没有现成的函数可以使用,可以通过transform使用自定义的函数

# 写法一:
data['counts'].transform(lambda x:x*2)

# 写法二:
def transform1(value):
    values = value*2
    return values
data['counts'].transform(transform1)

四、series字符串处理方法

data2 = pd.read_csv(r'D:/qq文档/2393971222/FileRecv/order-14.3.csv',sep=',',encoding='gbk',engine='python')
print(data.info())
data['dishes_name'].str.strip()
a = data.loc[data['dishes_name'].str.contains('鳝')]
a.drop_duplicates(subset='dishes_name')

五、df中去重的操作

一维使用方法:

data['dishes_name'].drop_duplicates()  # 删掉重复值

二维使用方法:

subset可以传入多个值,传入多个值时,同时满足时才算相同值

data.drop_duplicates(subset=['dishes_name','dishes_id'])

六、表格合并方法

(一)concat:侧重于纵向合并

# 纵向合并
df = pd.concat((df1,df2,...),axis=0)  # 列索引必须对应一致
# 横向合并
df = pd.concat((df1,df2,...),axis=1)  # 行索引必须对应一致
left = pd.DataFrame({'key1': ['K0', 'K0', 'K1', 'K2'],
                     'key2': ['K0', 'K1', 'K0', 'K1'],
                        'A': ['A0', 'A1', 'A2', 'A3'],
                        'B': ['B0', 'B1', 'B2', 'B3']})

right = pd.DataFrame({'key1': ['K0', 'K1', 'K1', 'K2'],
                      'key2': ['K0', 'K0', 'K0', 'K0'],
                         'C': ['C0', 'C1', 'C2', 'C3'],
                         'D': ['D0', 'D1', 'D2', 'D3']})
print(left)
print(right)

输出:

    A   B key1 key2
0  A0  B0   K0   K0
1  A1  B1   K0   K1
2  A2  B2   K1   K0
3  A3  B3   K2   K1
    C   D key1 key2
0  C0  D0   K0   K0
1  C1  D1   K1   K0
2  C2  D2   K1   K0
3  C3  D3   K2   K0

重要参数:join=‘outer’:外连接,求并集。join=‘inner’:内连接,求交集。

pd.concat((left,right),axis=0,join='inner')
key1key2
0K0K0
1K0K1
2K1K0
3K2K1
0K0K0
1K1K0
2K1K0
3K2K0

(二)merge:主键合并方法

解决行索引没有意义的情况下,数据行不匹配问题(解决concat中横向拼接问题)

参数说明:

  1. on:表示合并的主键,必须是两张表中公共的字段
  2. how:连接方式。默认是inner,可以是outer、inner、left、right
  3. left_on/right_on:代表分别指定两张表中的主键。当两个表中主键的名称不一致时,不能使用on时使用。
pd.merge(left,right,on='key1',how='left')

单主键输出:

ABkey1key2_xCDkey2_y
0A0B0K0K0C0D0K0
1A1B1K0K1C0D0K0
2A2B2K1K0C1D1K0
3A2B2K1K0C2D2K0
4A3B3K2K1C3D3K0
pd.merge(left,right,on=['key1','key2'],how='right')

多主键输出:

ABkey1key2CD
0A0B0K0K0C0D0
1A2B2K1K0C1D1
2A2B2K1K0C2D2
3NaNNaNK2K0C3D3
pd.merge(left,right,left_on='key1',right_on='key2',how='left')

两表分别指定主键:

ABkey1_xkey2_xCDkey1_ykey2_y
0A0B0K0K0C0D0K0K0
1A0B0K0K0C1D1K1K0
2A0B0K0K0C2D2K1K0
3A0B0K0K0C3D3K2K0
4A1B1K0K1C0D0K0K0
5A1B1K0K1C1D1K1K0
6A1B1K0K1C2D2K1K0
7A1B1K0K1C3D3K2K0
8A2B2K1K0NaNNaNNaNNaN
9A3B3K2K1NaNNaNNaNNaN

补充:更改表格名称的方法

left.rename(columns={'key1':'key222'},inplace=False)

(三):重叠合并方法

dict1 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':['W10','w10',np.nan,'w10',np.nan,np.nan,'w7','w7','w8']}

dict2 = {'ID':[1,2,3,4,5,6,7,8,9],
         'System':[np.nan,np.nan,'w7','w7','w7','w7','w8',np.nan,np.nan]}

df1 = pd.DataFrame(dict1)
df2 = pd.DataFrame(dict2)

df1.combine_first(df2)

以df1作为主表,利用df2中的表格数据填充df1,当df2中数据与df1不一致的时候,以df1为主。

输出:

IDSystem
01W10
12w10
23w7
34w10
45w7
56w7
67w7
78w7
89w8
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值