4.1 新增列
4.1.1 assign
Pandas中的assign()函数不仅可以实现不改变原数据情况下新增列,而且可以同时新增多列,还可以配合链式操作使用一行代码完成多个新增列创建,使得代码非常整洁。
(1)函数
# 新增列Sex_map,映射male为0,female为1
df.assign(Sex_map=lambda x:x.Sex.map({'male':0, 'female':1}))
df.assign(Sex_map=df['Sex'].map({'male':0, 'female':1})
(2)多列
新增多列时,按照前后顺序,后面列创建的计算过程中可以使用前面已创建的列。
df.assign(Sex_map=lambda x:x.Sex.map({'male':0, 'female':1}),
Sex_age=lambda x:x.Sex_map*x.Age)
(3)链式
df.assign(Sex_map=lambda x:x.Sex.map({'male':0, 'female':1})).\
assign(Sex_age=lambda x:x.Sex_map*x.Age)
# 不同写法
(
df.assign(Sex_map=lambda x:x.Sex.map({'male':0, 'female':1})).\ assign(Sex_age=lambda x:x.Sex_map*x.Age)
)
4.2 插入列
4.2.1 insert
### 对Sex变量加工一个新的变量,并且插入到Sex变量之后
df.columns.get_loc('Sex')
--------------
4
df.insert(loc=5,
columns='Sex_map',
value=df['Sex'].map({'male':0, 'female':1})
4.3 移除列
4.3.1 pop
pop( )可以移除指定列,但参数只接受一个列名,不能同时移除多列,并且在未找到要移除的列名还会提示报错。
df.pop('Sex_map')
4.3.2 difference(更好)
将不在列表中的列名全部筛选出来,然后再用列名筛选匹配的数据。
df[df.columns.difference(['Sex', 'Sex_map'])]
4.4 列转行
dic_0 = {
'球队':['湖人', '勇士', '凯尔特人'],
'球员':[['詹姆斯','戴维斯','里弗斯'],
['库里','汤普森','格林'],
['塔图姆','布朗','霍乐迪']
]
}
df = pd.DataFrame(dic_0)
4.4.1 explode
(1)重置索引
df.explode('球员', ignore_index=True) # ignore_index=True重置索引
(2)去重
df.explode('球员').drop_duplicates()
(3)格式调整
explode( )的column参数只能处理列表形式的对象,若原数据中没有explode可接受的格式,需要进行转换。
dic_0 = { '球队':['湖人', '勇士', '凯尔特人'],
'球员':['詹姆斯,戴维斯,里弗斯',
'库里,汤普森,格林',
'塔图姆,布朗,霍乐迪'] }
df = pd.DataFrame(dic_0)
df['球员'] = df['球员'].str.split(',')
4.5 行转列
行转列是列转行的反向操作,即将多行数据合并后转成一个列表。
4.5.1 groupby聚合
(1)apply
df.groupby('球队').apply(lambda df:df['球员'].tolist().\
reset_index().rename(columns={0:'球员'})
(2)agg
df.groupby(['球队'])['球员'].agg(list).to_frame().reset_index()