Pandas 排序

# serious 排序
df['score'].sort_values(ascending=false)

# dataframe 单列排序
df.sort_vaules(by='score')
df.sort_values(by='score',ascending=fales)

# dataframe 多列排序
df.sort_values(by=['score','name'],ascending=[fales,true],inplace=false)

pandas 字符串处理

# 使用原则
1. 使用方法:先获取series的str属性,然后在属性上调用函数
2. 只能在字符串列上使用,不能数字列使用函数
3. dataframe 上没有str的属性和处理方法
4. series.str不是python原声字符串,但相似

# 使用方法: series.str.[func]

# 多次str处理的链式操作
df['ymd'].str.replace('-','').str.slice(0,6)
df['ymd'].str.replace('-','').str[0:6]

# str 对正则表达的处理
def add_new(x):
    year,month,day = x['ymd'].split('-')
    return f'{year}年{month}月{day}日'
df['中文日期'] = df.apply(add_new,axis=1)

# 去掉年月日
df['中文日期'].str.replace('年','').str.replace('月','').str.replace('日','')

df['中文日期'].str.replace('[年月日]','')

pandas 的axis 参数理解

# axis=0 or 'index'
单行操作,指某一行
聚合操作,指跨行cross rows

# axis=1 or 'colums'
单列操作,指某一列
聚合操作,指跨行cross columns

# 删除列
df.drop['A',axis=1]
# 删除行
df.drip[1,axis=0]

# 平均值
df.mean(axis=0) # 最终变成一行
df.mean(axis=1) # 最终变成一列

pandas 索引index

# index 用途
1. 更方便的数据查询
2. 查询性能提升
3. 自动的数据对其功能
4. 更多更强大的数据结构支持

# 修改索引
df.set_index('useridID',inplace=True,drop=False)
# 查看index
df.index
# 使用index 查询
df.loc[df['userID']==500].head(5)
df.loc[500].head(5)

# index 提升性能
1. 如果index唯一,pandas使用哈希表优化,O(1)
2. index不唯一,但有序,pandas使用二分查找, O(logN)
3. index 随机, 全表扫描, O(N)

# index 能自动对齐数据
s1 + s2 会把index 相同的进行相加

# index支持更多数据结构
1. categoricalIndex 基于分类的index,提升性能
2. multiIndex 基于groupby多位聚合后的结果
3. datetimeIndex, 时间类型索引

# index 方法
1. index 是否递增
df.index.is_monotonic_increasing
2. index是否唯一
df.index.is_unique
3. 将index排序
df.sort_index()


pandas 合并 merge

# merge grammer
pd.merge(left,right,how='inner',on='aa',left_on='bb',right_on='cc',left_index=false,right_index=false,sort=true,suffixes=['_x','_y'])

# merge three file

1. read three files
df_file01 = pd.read_csv(
'file_paht',sep='::',engine='python',
name='userid::movieid::rating::timestamp'.split('::'))

2. merge
# inner: 两边都有数据保留,否则丢弃
df_new = pd.merge(df01,df02,left_on='movieid',right_on='movieid',how='inner')

# 理解merge数量对齐关系
1. one-to-one 一对一关系,关联的key 唯一
2. one-to-many
3. many-to-many   

# left,right,inner,
left: 保留左表所有数据
right:保留右表所有数据
inner: 保留两表交集
outer join:并集

# 处理非key 字段重名
pd.merge(left,right,on='key',suffixes=['_left','_right'])

pandas 数据合并 concat

#concat 语法
pandas.concat(objs,axis=0,join='outer',ingnore_index=false)

# appdend 按行合并
dataframe.append(other,ingonre_index=false)
other: 单个dataframe,series,dict or list
ignore_index: 是否忽略原来的数据索引
    
# 使用concat添加列
pd.concat([df,s1],axis=1) # single line
s = df.apply(lambda x:x['A']+'_aa',axis=1)
pd.concat([df,s1,s2],axis=1) # multiple line

pd.concat([s1,s2],axis=1) # 列表只有series

pd.concat([s1,df1,s2],axis=1) # 列表可以混合顺序


# append 按行合并数据
1. 给打他frame添加一个dataframe
df1.append(df2,ignore_index=false)

2. 一行一行给dataframe添加数据
# 创建空的dataframe
df = pd.DataFrame(columns=['A'])
# 低性能创建
for i in range(5):
    df = df.append(['A',i],ingore_index=true)
    
# 高性能版本
pd.concat(
[pd.DataFrame[i],columns=['A'] for i in range(5)], ignore_index=true
)

Pandas 批量拆分和合并Excel

# 大excel拆成多个,分配给不同的人
使用df.iloc将搭的df拆成多个df

1. 计算没人行数
users = ['a','b','c']
slit_size = row_count // len(users)
if row_count % len(users) != 0:
    split_size += 1
    
2. 拆分excel
df_subs = []
for i, user in enumerate(users):
    begin = i * split_size
    end = begin + split_size
    
    df_sub = df_source.iloc[begin:end]
    df_subs.append((i,user,df_sub))
    
3. 存入excel
for i ,user, df_sub in df_subs:
    file_name = f'aa{user}'
    df_sub.to_excel(file_name,index=false)

# 多个小的excel 合并成一个大的
1. 遍历文件夹,获取要合并的excel列表
2. 分别去读到dataframe,给每个df加一列标记源
3. concat进行合并

excel_names = []
for excel_name in os.listdir(dir):
    excel_names.append(excel_name)
    
df_list = []
for i in excel_names:
    to_path = f'{splits_dir}/i'
    df_split = pd.read_excel(i)
    
    username = i.replace('前缀','').replace('后缀','')[2:]
    
    df_split['username'] = username
    df_list.append(df_split)
    
df_merge = pd.concat(df_list)
df_merge.to_excel('path',index=false)

pandas实现groupby分组统计

# 分组使用聚合函数做数据统计
 
1. 单个列groupby
df.groupby('a').sum() # 非数字列自动忽略

2. 多个列groupby
df.groupby(['a','b'],as_index=false).mean()

3. 同时查看多种数据统计
df.groupby('a').agg([np.sum,np.mean,np.std])

4. 查看单列的数据统计结果
df.groupby('a')['c'].agg([np.sum,np.mean,np.std]) 

5. 不同的列使用不同的聚合函数
df.groupby('a').agg({'c':np.sum,'d':np.mean})

# 具体分析groupby 
g = df.groupby('a')
for name,group in g:
    print(name)
    print('group is a dataframe')
    
取单个分组的数值
g.get_group('bar')

Pandas 分层索引multiindex

分层索引:在一个轴向上拥有多个索引层级,可以表达更高维度数据形式
方便进行数据筛选,有序性能更好
groupby, 如果是多key, 结果为分层索引

# series 多层索引multiindex怎么筛选数据
ser.loc['baidu']
ser.loc[('baidu','2021' )]
ser.loc[:,'2021']

# dataframe 多层索引筛选数据
1. 元组表示筛选多层索引,一级索引,二级索引
2. 列表代表同一层的多个key

stockes.loc[(['baidu','jingdong'],'2029'),:]
筛选一级索引所有内容
stocks.loc[(slice(None),['2019','2021']),:]

# 多级索引变成普通的列
stocks.reset_index()

pandas 的数据转换函数

map, apply, applymap

1. map:只用于series,实现每个值到值得映射
2. apply: 用户series实现每个值得处理, 用于dataframe 实现每个轴得series处理
3. applymap: 只能用户dataframe, 用于处理dataframe的每个元素
 
### map 
方法一: Series.map(dict)
# 股票代码英文转换成中文
dict_company_names = {
    'baba':'阿里巴巴'
}

stocks['chinese name'] = stocks['gongsi'].str.lower().map(dict_company_names)

方法二: Series.map(func)
stocks['chinese name'] = stocks['gongsi'].map(lambda x: dict_company_names[x.lower()])

### apply 
Series.apply(func) 函数参数为每个值
DataFrame.apply(func) 函数参数为Series
 
stocks['chinese name'] = stocks['gongsi'].apply(lambda x: dict_company_names[x.lower()])

stocks['chinese name'] = stocks.apply(lambda x: dict_company_names[x['gongsi'].lower()],axis=1)

### applymap
用于dataframe中所有值得转换
sub_df = stocks[['开盘','收盘']]

stocks[:,['开盘','收盘']] = sub_df.applymap(lambda x: int(x))
    

pandas 怎么对分组应用apply 函数

pandas 方法总结

# 查看行数,列数
df.shape #(258,3)

# 去重
df['公司'].unique 

# 总行数
df.count()

# 计时查询ID==500 数据的性能
%timeit df.loc[500]

# 拥有二级索引的series转换成dataframe
ser.unstack()

# 重建索引
ser.reset_index()
posted on 2022-02-19 19:04  Afrafre  阅读(24)  评论(0编辑  收藏  举报