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 | 湖人 | [詹姆斯, 戴维斯, 里弗斯] |
---|