Pandas进行数据分析

创建Series:创建一个包含布尔类型数据的 Series,并指定索引

data = [True, False, True, True, False]
index = ['A', 'B', 'C', 'D', 'E']
series = pd.Series(data, index=index)

创建df

data = {
    'Column1': [True, False, True, True, False],
    'Column2': [False, True, True, False, True]
}
df = pd.DataFrame(data)

查看数据信息

df.info()
df.describe()
df['字段名'].value_counts()

dataframe添加列:df2.drop('新增加的列:',axis=1,inplace=True)
在Pandas中,DataFrame的列是Series对象,而Series对象具有一系列字符串处理方法。要对Series中的字符串进行操作,需要使用.str属性来访问这些字符串方法。删除列中的横线
df2['来源明细'].str.lstrip('-')
转格式:df2['日期'] = pd.to_datetime(df2['日期'])
前13行:df2.iloc[:13,:]

loc和iloc的使用:
第一列和第5列:df2.iloc[:,[0,4]],使用df2.loc[:,[0,4]]则报错
使用loc进行bool条件筛选:df2.loc[df2['图书类型']=='小说',:]
使用名称进行列筛选:df2.loc[:,['图书类型','来源']]

pd.merge()表横向合并:concat()函数可以用来进行文件夹中的数据合并
必须的参数是左表和右表
索引列没有字段名,参数写left_index=True, right_index=True
类似数据库中的左连接右连接内连接和外连接,how='left/right/inner/outer'
指定匹配的字段: on=

判断控制df['用户ID'].isnull() ,不能用df['用户ID'] == 'null',这是字符串的判断,判断值是否是字符串null

pd.dropna()删除空行,会创建一个新的df
修改源数据df = df.dropna()
参数为空时,只要数据有空时就会删除一行。
指定列出现空值继续删除可以用:df.dropna(subset=['支付转化率'])

final.drop(columns='类目') 删除列

repeat.drop_duplicates()去重
subset 参数,删除这个字段重复的行,保留了各自不重复的第一行。如果要保留最后一行,再指定参数keep='last'

df.sort_values('字段名', ascending=False)
ascending默认True,升序。无论那种,会将nan值的放在最后边。
筛选前三df.sort_values('客单价', ascending=False).head(3)

inplace=False默认时False,尽量不要设置为True。

字符串截取

df['年份'] = df['日期'].str.slice(0,4)  # 左闭右开
df['日期'].str[:4]  # 左闭右开
final['大类目'] = final['类目'].str.split('&').str[0] # 按照分隔符截取

rename重命名
final.rename(columns={'2022':'2022年销售额', '2023':'2023年销售额'}) or final.columns = ['2022年销售额','2023年销售额']

df.groupby()进行分组
分组完后,不会有输出。要有输出,需要加上sum(),mean()函数
例如df.groupby('地区').sum(),默认将地区作为索引,如果想要数字为索引,groupby 内传入参数 as_index = False
(sum函数中有参数和没参数输出都是一样的,本来就不应该有参数)
如果只想查看某个字段,可以使用df.groupby('地区')['客单价', ‘利润’].sum()

pd.cut()分组
bins对访客进行分区。labels表示标签类型。right默认为True,表示前开后闭,设置为False,前闭后开。
添加一行新的列,对访客量打上一个级别标签:
df['访客数标签级别'] = pd.cut(df['访客数'], bins=[0,100,1000,10000,100000], right=False, labels=['十','百','千','万'])

获取分组后最大最小值,并保持pd格式。感觉没区别,第一种还更加简单,第二种Tab不出来函数。
score.groupby('姓名', as_index=False)[总成绩'].max()
score.groupby('姓名')['总成绩'].apply(min).reset_index()
pd.merge()合并两张表可以将最大值和最小值放在同一个表里

地区中,排名第三利润的城市:

orderSort = order.sort_values(['省份','近1月销售额'], ascending=False).head(20) # 根据地区和销售额进行排名
def get_third(x):
    if len(x) <= 2:
        return x.iloc[len(x)-1,:]
    else:
        return x.iloc[2,:]
orderSort.groupby('省份')[['城市','近1月销售额']].apply(get_third) # 理解为有多个表,取出表中的城市和销售额字段记为x,将x应用apply函数

读取文件夹中的数据

result = pd.DataFrame()
for name in os.listdir():
    df = pd.read_excel(name)
    df['销售额'] = df['访客数'] * df['转化率'] * df['客单价']
    df['年份'] = df['日期'].str.slice(0,4) # df['日期'].str[:4] 左闭右开
    
    df_sum = df.groupby('年份')['销售额'].sum().reset_index()
    df_sum['类目'] = name.replace('.xlsx','')
    
    result = pd.concat([result, df_sum])

result.head()
	

pd.pivot_table 数据透视表,注意双索引 引起的错误。

# 按照类目和年份做一个透视
df1 = pd.pivot_table(result, index='类目', columns='年份', 
                       values='销售额', aggfunc='sum')
df1 = df1.rename(columns={'2022':'2022年销售额', '2023':'2023年销售额'})
df1.head()

在这里插入图片描述

df2 = pd.pivot_table(result,index = '类目',columns = '年份',values = '销售额',aggfunc = 'sum').reset_index()
df2.columns=['类目','2022年销售额','2023年销售额']
df2.head()

在这里插入图片描述

四分位法剔除异常值


当 K=1.5时,中度异常,K=3时,极度异常。
计算上下界并排除:

# 四分位法 
up  = df.describe()['实付金额']['75%'] + (df.describe()['实付金额']['75%']-df.describe()['实付金额']['25%'])*3
low = df.describe()['实付金额']['25%'] - (df.describe()['实付金额']['75%']-df.describe()['实付金额']['25%'])*3
df = df.loc[ (df['实付金额']<=up ) & (df['实付金额']>=low),:] # 不能用and,测试了,因为类型时Series

cumsum() 计算累加和
ct_count['累计订单数占比'] = ct_count['订单数占比'].cumsum()

注意
group_kneed['是否复购'] = group_kneed['用户ID'].isin(repur['用户ID'])group_kneed['是否复购'] = group_kneed['用户ID'].isin(repur)结果不一样,第二种是错的。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值