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 的值列

长格式

id date 产品 销售
1 202301 电脑 3
2 202302 手机 5
3 202302 电脑 2
4 202301 手机 6
5 202303 电脑 1
6 202303 手机 7

宽格式

id date 电脑 手机
1 202301 3 6
2 202302 2 5
3 202303 1 7
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 用户名 202301 202302 202303
1 a 30 60 80
2 b 20 50 90
3 c 10 70 50

长格式

id 用户名 年份 消费
1 a 202301 30
2 b 202301 20
3 c 202301 10
1 a 202302 60
2 b 202302 50
3 c 202302 70
1 a 202303 80
2 b 202303 90
3 c 202303 50
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基础操作的函数可以帮助我们在数据预处理的时候更好的对数据进行筛选。总的来说,在处理不同数据格式和筛选时非常有用的工具

你可能感兴趣的:(python基础,pandas)