目录
最近爬取数据整体是表格形式的,但后台数据是单条单条的,这里将结果利用list转dataframe的方式存在csv文件中,记录一下用到的数据分析的知识点
list转dataframe格式
import pandas as pd
df = pd.Dataframe(....)
示例:
a = [['自主访问', '1,193', '981', '554', '14.49%', '趋势'],
['购物车', '1,731', '1466', '846', '28.36%', '趋势'],
['我的淘宝', '950', '777', '634', '9.46%', '趋势'],
['直接访问', '0', '253', '37', '0.00%', '趋势']]
# list转成Dataframe格式
df = pd.DataFrame(a)
"""
0 1 2 3 4 5
0 自主访问 1,193 981 554 14.49% 趋势
1 购物车 1,731 1466 846 28.36% 趋势
2 我的淘宝 950 777 634 9.46% 趋势
3 直接访问 0 253 37 0.00% 趋势
"""
dataframe部分操作
# 删除dataframe指定列
df = df.drop(columns=[5])
# 将某列设为索引列
df.set_index([0], inplace=True)
# 指定columns
df.columns = ['流量来源','本店交易指数', '竞店1交易指数', '竞店2交易指数', '本店支付金额']
# 新增列
df['data_time'] = ['2019/5/1', '2019/5/2'] * 5
df['kinds'] = ['客群指数'] * df.shape[0]
# 指定索引列 列名
df.index.name='流量来源'
更改数据类型
df[['本店交易指数','竞店1交易指数','竞店2交易指数']] = df[['本店交易指数','竞店1交易指数','竞店2交易指数']].astype('int')
df
dataframe应用函数到某列或几列,df.apply()
# 函数作用到某列 apply
df[1] = df[1].apply(lambda x: int(x.replace(',','')))
# 函数作用到多列 applymap
df[[1,2,3]] = df[[1, 2,3]].applymap(lambda x: int(x.replace(',','')))
dataframe合并
# 纵向合并, concat
total_df = pd.concat([df, df2],ignore_index=True )
# keys表示对纵向各分组进行命名
s_new = pd.concat([s1, s2, s3], keys=['本店交易指数','竞店1交易指数','竞店2交易指数'])
s_new
# 横向合并dataframe,how,默认内连接,此处为外连接,on为连接列,suffixes为连接属性后下标
new_merge = pd.merge(df, df_2, on=['流量来源', 'data_time'], suffixes=('_流量指数','_客群指数'), how='outer')
dataframe透视表
第一个参数表示作用列,index指代透视表行,columns指代透视表列
# 借助透视表进行数据重排,需要保证数据类型能够实现聚合函数,aggfun,默认取平均数
s = total_df.pivot_table(['本店交易指数','竞店1交易指数','竞店2交易指数'],index=['data_time','流量来源'], columns='kinds')
s2 = total_df.pivot_table(['本店交易指数','竞店1交易指数','竞店2交易指数'],index=['data_time','流量来源'], columns='kinds',aggfunc=sum)
dataframe在csv文件读取
# 读取含中文的文件名时,加上 engine='python',内容含中文时,加上 encoding='utf_8_sig'
data = pd.read_csv('data_阿道夫梦卓专卖店_徽歌旗舰店.csv',engine='python', encoding='utf_8_sig')
dataframe选取/删除满足特定条件的行 /列
选取满足某些条件的行,可以用isin(),由于dataframe没有not in ,所有这里用“~”作为取反的作用,达到删除某些行的目的。
背景: 现在有data1和data2两个数据集,列名相同,结构一致,要在data1中排除data2的行
data3 = data1.loc[~data1['user_id'].isin(list(data2['user_id']))]
dataframe存入文件时,由于数据过长,导致csv/xlsx文件中数据尾数为E+17,还原后数据还不对
这里给到的解决变化是,在存入之前,将这列类型改为字符串,就能避免的~
data3['user_id'] = data3['user_id'].map(lambda x: str(x))
dataframe转成字典形式
背景是这样的:我有两份excel,然后呢要在A数据中根据product_id添加一个字段brand,这两个字段的关系存在B中,我的想法就是读出两个dataframe:data_A,data_B,然后就用map去匹配出对应的字段了。写map的时候发现用字典更好解决,所以就用到了dataframe转字典了~
主要用的知识点是:df.to_dict(),
详细的可以去看:
Python中将dataframe转换为字典
pandas to_dict 的用法
- 原始数据
- 这里以production_id作为keys,所以要将df的索引设为production_id。to_dict中的参数有6种,这里选用的list
dict_brand = data_brand.set_index('production_id').T.to_dict('list')
- 结果展示
创建空的dataframe
在处理数据的时候会遇到列表为空的情况,但是我又需要这些列来占位,这里就需要创建一个空的dataframe。
user_source_data = []
# user_source_data = [['自主访问', '1,193', '981', '554', '14.49%']]
if user_source_data:
user_source_df = pd.DataFrame(user_source_data)
user_source_df.columns = ['user_id', 'kuaishou_id', 'kuaishou_emv', 'kuaishou_follower_number',
'kuaishou_estimate_month_pv']
print('有数据')
print(user_source_df)
else:
print('没有数据')
user_source_df = pd.DataFrame(columns=('user_id', 'kuaishou_id', 'kuaishou_emv', 'kuaishou_follower_number',
'kuaishou_estimate_month_pv'))
print(user_source_df)
# 没有数据
# Empty DataFrame
# Columns: [user_id, kuaishou_id, kuaishou_emv, kuaishou_follower_number, kuaishou_estimate_month_pv]
# Index: []