dataframe数据处理用到的一些知识点


最近爬取数据整体是表格形式的,但后台数据是单条单条的,这里将结果利用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: []
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值