1.新增列
1.1 assign
Pandas中提供的assign()
函数不仅可以实现不该表原数据情况下新增列,而且可以同时新增多列,还可以配合链式操作使用一行代码完成多个新增列的创建,使得代码非常整洁。
函数
import numpy as np
import pandas as pd
df=pd.read_csv('data/titanic.csv')
df.assign(Sex_map=lambda x: x.Sex.map({'male':1, 'female':0})).head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Sex_map |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
0 |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
0 |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
0 |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
1 |
多列
df.assign(Sex_map = lambda x: x.Sex.map({'male':1, 'female':0}),
Sex_age = lambda x: x.Sex_map * x.Age).head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Sex_map |
Sex_age |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
22.0 |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
0 |
0.0 |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
0 |
0.0 |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
0 |
0.0 |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
1 |
35.0 |
链式
(
df.assign(Sex_map=lambda x:x.Sex.map({'male':1,'female':0})). \
assign(Sex_age=lambda x:x.Sex_map*x.Age).head()
)
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
Sex_map |
Sex_age |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
22.0 |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
0 |
0.0 |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
0 |
0.0 |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
0 |
0.0 |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
1 |
35.0 |
2. 插入列
2.1 insert
正常情况下对dataframe添加一个新列时,默认情况下会在末尾添加,Pandas提供了insert
函数可以在任何位置添加新列。
df.columns.get_loc('Sex')
4
df.insert(loc=5,
column='Sex_map',
value=df['Sex'].map({'male':1,'female':0}))
df.head()
|
PassengerId |
Survived |
Pclass |
Name |
Sex |
Sex_map |
Age |
SibSp |
Parch |
Ticket |
Fare |
Cabin |
Embarked |
0 |
1 |
0 |
3 |
Braund, Mr. Owen Harris |
male |
1 |
22.0 |
1 |
0 |
A/5 21171 |
7.2500 |
NaN |
S |
1 |
2 |
1 |
1 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
female |
0 |
38.0 |
1 |
0 |
PC 17599 |
71.2833 |
C85 |
C |
2 |
3 |
1 |
3 |
Heikkinen, Miss. Laina |
female |
0 |
26.0 |
0 |
0 |
STON/O2. 3101282 |
7.9250 |
NaN |
S |
3 |
4 |
1 |
1 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
female |
0 |
35.0 |
1 |
0 |
113803 |
53.1000 |
C123 |
S |
4 |
5 |
0 |
3 |
Allen, Mr. William Henry |
male |
1 |
35.0 |
0 |
0 |
373450 |
8.0500 |
NaN |
S |
3. 移除列
pop()
只能移除单列,不太方便,推荐使用difference()
函数。
df[df.columns.difference(['Sex_map','Sex'])].head()
|
Age |
Cabin |
Embarked |
Fare |
Name |
Parch |
PassengerId |
Pclass |
SibSp |
Survived |
Ticket |
0 |
22.0 |
NaN |
S |
7.2500 |
Braund, Mr. Owen Harris |
0 |
1 |
3 |
1 |
0 |
A/5 21171 |
1 |
38.0 |
C85 |
C |
71.2833 |
Cumings, Mrs. John Bradley (Florence Briggs Th... |
0 |
2 |
1 |
1 |
1 |
PC 17599 |
2 |
26.0 |
NaN |
S |
7.9250 |
Heikkinen, Miss. Laina |
0 |
3 |
3 |
0 |
1 |
STON/O2. 3101282 |
3 |
35.0 |
C123 |
S |
53.1000 |
Futrelle, Mrs. Jacques Heath (Lily May Peel) |
0 |
4 |
1 |
1 |
1 |
113803 |
4 |
35.0 |
NaN |
S |
8.0500 |
Allen, Mr. William Henry |
0 |
5 |
3 |
0 |
0 |
373450 |
4. 列转行
import pandas as pd
dict = {
'球队':['湖人','凯尔特人','勇士'],
'球星':[
['詹姆斯','戴维斯','里弗斯'],
['塔图姆','布朗','霍乐迪'],
['库里','汤普森','格林']
]
}
df = pd.DataFrame(dict)
df
|
球队 |
球星 |
0 |
湖人 |
[詹姆斯, 戴维斯, 里弗斯] |
1 |
凯尔特人 |
[塔图姆, 布朗, 霍乐迪] |
2 |
勇士 |
[库里, 汤普森, 格林] |
4.1 explode
explode()
函数可以实现将列表形式的数据转为行,并复制索引值。
df.explode('球星')
|
球队 |
球星 |
0 |
湖人 |
詹姆斯 |
0 |
湖人 |
戴维斯 |
0 |
湖人 |
里弗斯 |
1 |
凯尔特人 |
塔图姆 |
1 |
凯尔特人 |
布朗 |
1 |
凯尔特人 |
霍乐迪 |
2 |
勇士 |
库里 |
2 |
勇士 |
汤普森 |
2 |
勇士 |
格林 |
df1 = df.explode('球星', ignore_index=True)
df1
|
球队 |
球星 |
0 |
湖人 |
詹姆斯 |
1 |
湖人 |
戴维斯 |
2 |
湖人 |
里弗斯 |
3 |
凯尔特人 |
塔图姆 |
4 |
凯尔特人 |
布朗 |
5 |
凯尔特人 |
霍乐迪 |
6 |
勇士 |
库里 |
7 |
勇士 |
汤普森 |
8 |
勇士 |
格林 |
格式调整
explode()
只能处理列表形式的对象,如list、tuple、Series、ndarray等。如遇到非以上类型,需转换后,再用explode()
处理。
dict1 = {
'球队':['湖人','凯尔特人','勇士'],
'球星':['詹姆斯,戴维斯,里弗斯',
'塔图姆,布朗,霍乐迪',
'库里,汤普森,格林']
}
df = pd.DataFrame(dict1)
df
|
球队 |
球星 |
0 |
湖人 |
詹姆斯,戴维斯,里弗斯 |
1 |
凯尔特人 |
塔图姆,布朗,霍乐迪 |
2 |
勇士 |
库里,汤普森,格林 |
df['球星'] = df['球星'].str.split(',')
df
|
球队 |
球星 |
0 |
湖人 |
[詹姆斯, 戴维斯, 里弗斯] |
1 |
凯尔特人 |
[塔图姆, 布朗, 霍乐迪] |
2 |
勇士 |
[库里, 汤普森, 格林] |
5. 行转列
借助groupby
的聚合方法,可以通过agg
或者apply
实现。
df1.groupby('球队').apply(lambda df1: df1['球星'].tolist()).reset_index().rename(columns={0:'球星'})
|
球队 |
球星 |
0 |
凯尔特人 |
[塔图姆, 布朗, 霍乐迪] |
1 |
勇士 |
[库里, 汤普森, 格林] |
2 |
湖人 |
[詹姆斯, 戴维斯, 里弗斯] |
df1.groupby(['球队'])['球星'].agg(list).to_frame().reset_index()
|
球队 |
球星 |
0 |
凯尔特人 |
[塔图姆, 布朗, 霍乐迪] |
1 |
勇士 |
[库里, 汤普森, 格林] |
2 |
湖人 |
[詹姆斯, 戴维斯, 里弗斯] |