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)
- )
- ### 对Sex变量加工一个新的变量,并且插入到Sex变量之后
- df.columns.get_loc('Sex')
- --------------
- 4
-
-
- df.insert(loc=5,
- columns='Sex_map',
- value=df['Sex'].map({'male':0, 'female':1})
pop( )可以移除指定列,但参数只接受一个列名,不能同时移除多列,并且在未找到要移除的列名还会提示报错。
df.pop('Sex_map')
将不在列表中的列名全部筛选出来,然后再用列名筛选匹配的数据。
df[df.columns.difference(['Sex', 'Sex_map'])]
- dic_0 = {
- '球队':['湖人', '勇士', '凯尔特人'],
- '球员':[['詹姆斯','戴维斯','里弗斯'],
- ['库里','汤普森','格林'],
- ['塔图姆','布朗','霍乐迪']
- ]
- }
- df = pd.DataFrame(dic_0)

(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(',')
行转列是列转行的反向操作,即将多行数据合并后转成一个列表。
(1)apply
- df.groupby('球队').apply(lambda df:df['球员'].tolist().\
- reset_index().rename(columns={0:'球员'})
(2)agg
df.groupby(['球队'])['球员'].agg(list).to_frame().reset_index()