4.Pandas行列进阶操作

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函数可以在任何位置添加新列。

# 找到Sex变量所在位置
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 湖人 [詹姆斯, 戴维斯, 里弗斯]

你可能感兴趣的:(Pandas,pandas,人工智能,数据挖掘)