Pandas loc和iloc 以及 pivot和melt详解

  1. pandas的iloc和loc是分别使用位置和标签(列名或者行名)进行筛选数据。其中iloc是位置索引,loc是根据标签筛选。
  2. pivot和melt是pandas对整个数据表进行更改,其中pivot是将长格式数据列变成宽格式数据列(把某列的数据变成列名),melt是将宽数据格式变成长数据格式()

1. iloc

1.1 简单切片索引

#因索引从0开始
data.iloc[1:2,:]:选取第2-3行的值但是选不到3,列全选,2行所有列的值
data.iloc[1,2]1表示第2行,2表示第三列,选取23列的值
data.iloc[1:2,1:2]:第2行第2列的值
data[1,:]:第1行所有列的值
data[:,2]:第2列所有行的值

从中可以看出当不存在切片:符号时,选取的是某单个值,存在切片:时,选取的数据片,即某几列或几行数据。

1.2 根据bool值索引

boolean_selection = df.iloc[:, [True, False, True]]# 选择第一列和第三列的所有行

在数据预处理中,pandas很多函数返回的都是bool类型,例如isnull,当我们筛选哪些特征存在空值时,即可使用iloc

boolean_selection = df.iloc[:, df.isnull().any()]# 选择所有为空的列

注意:因为df.isnull()是每个值是否为空的二维bool数组,而iloc传递的bool是一维列表,故使用any对每列进行聚合,检查是否有至少一个 True 值,有一个空值就是该列就是True,没有查找到该列就是False。

2. loc

2.1 根据标签名索引

注意loc筛选[A,B],其中AB都可以使用标签名切片。

df.loc['A':'D','Name':'Salary']# 选取A到D行,name-salary列
data.loc['A',:] #选取A行所有值
data.loc[:,'B'] #选取B列所有值
data.loc[1:2,'columns_name'] #选取columns_name中1-2即第2行的数据 根据列名筛选行 限制列数 
data.loc[data['columns_name']=='name1',:]#根据行标签中某个值筛选所有的列。限制行数
data.loc[data['columns_name']=='name1','columns_name'] #限制行列数 注意不能使用索引切片 

2.2 根据bool条件索引

根据某行的条件或者某列的条件进行筛选。

boolean_selection =df.loc[df['Age'] > 30,:]  # 选择 'Age' 列中大于 30 的所有行和列 df['Age'] > 30 返回的是行的bool类,若大于30就是True否则False
print(boolean_selection)

3. pivot

将pandas的DataFrame格式数据从长格式转变为宽格式。

pd.pivot(index=None, columns=None, values=None)

  • index:新 DataFrame 的索引列。
  • columns:需要变宽的列名。新 DataFrame 的列名,可以是单个列名或包含多个列名的列表
  • values:需要变宽的列名的 DataFrame 的值列

长格式

iddate产品销售
1202301电脑3
2202302手机5
3202302电脑2
4202301手机6
5202303电脑1
6202303手机7

宽格式

iddate电脑手机
120230136
220230225
320230317
import pandas as pd

data = {'Date': ['202301', '202302', '202302', '202301','202303','202303'],
        'Variable': ['电脑', '手机', '电脑', '手机','电脑', '手机'],
        'Value': [3,5,2,6,1,7]}
df_long = pd.DataFrame(data)
print(df_long)
df_wide = df_long.pivot(index='Date', columns='Variable', values='Value')
print(df_wide)

4. melt

将pandas的DataFrame格式数据从宽格式转变为长格式。

pd.melt(frame, id_vars=None, value_vars=None, var_name=None, value_name=‘value’, col_level=None)

  • frame:要进行重塑的 DataFrame。
  • id_vars:被保留不被重塑的列,即保持不变的列
  • value_vars: 需要被重塑的列
  • var_name:新生成的列名,存储原始列名的列。
  • value_name:新生成的列名,存储原始列名的值

宽格式

id用户名202301202302202303
1a306080
2b205090
3c107050

长格式

id用户名年份消费
1a20230130
2b20230120
3c20230110
1a20230260
2b20230250
3c20230270
1a20230380
2b20230390
3c20230350
import pandas as pd

data = {'id': [1,2,3],
        '用户名': ['a', 'b', 'c'],
        '202301': [30,20,10],
       '202302':[60,50,70],
       '202303':[80,90,50]}
df_wide = pd.DataFrame(data)
df_long = df_wide.melt(id_vars=['id','用户名'],value_vars=['202301','202302','202303'],var_name='年份',value_name='消费')
#或
df_long2 = pd.melt(frame=df_wide,id_vars=['id','用户名'],value_vars=['202301','202302','202303'],var_name='年份',value_name='消费')


4. 总结

iloc loc melt pivot 这些对pandas基础操作的函数可以帮助我们在数据预处理的时候更好的对数据进行筛选。总的来说,在处理不同数据格式和筛选时非常有用的工具

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值