4.Pandas行列进阶操作

2023-12-13 18:31:40

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()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSex_map
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS1
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C0
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS0
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S0
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS1
多列
df.assign(Sex_map = lambda x: x.Sex.map({'male':1, 'female':0}),
          Sex_age = lambda x: x.Sex_map * x.Age).head()
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSex_mapSex_age
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS122.0
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C00.0
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS00.0
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S00.0
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS135.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()
)
PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarkedSex_mapSex_age
0103Braund, Mr. Owen Harrismale22.010A/5 211717.2500NaNS122.0
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female38.010PC 1759971.2833C85C00.0
2313Heikkinen, Miss. Lainafemale26.000STON/O2. 31012827.9250NaNS00.0
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female35.01011380353.1000C123S00.0
4503Allen, Mr. William Henrymale35.0003734508.0500NaNS135.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()
PassengerIdSurvivedPclassNameSexSex_mapAgeSibSpParchTicketFareCabinEmbarked
0103Braund, Mr. Owen Harrismale122.010A/5 211717.2500NaNS
1211Cumings, Mrs. John Bradley (Florence Briggs Th...female038.010PC 1759971.2833C85C
2313Heikkinen, Miss. Lainafemale026.000STON/O2. 31012827.9250NaNS
3411Futrelle, Mrs. Jacques Heath (Lily May Peel)female035.01011380353.1000C123S
4503Allen, Mr. William Henrymale135.0003734508.0500NaNS

3. 移除列

pop()只能移除单列,不太方便,推荐使用difference()函数。

df[df.columns.difference(['Sex_map','Sex'])].head()
AgeCabinEmbarkedFareNameParchPassengerIdPclassSibSpSurvivedTicket
022.0NaNS7.2500Braund, Mr. Owen Harris01310A/5 21171
138.0C85C71.2833Cumings, Mrs. John Bradley (Florence Briggs Th...02111PC 17599
226.0NaNS7.9250Heikkinen, Miss. Laina03301STON/O2. 3101282
335.0C123S53.1000Futrelle, Mrs. Jacques Heath (Lily May Peel)04111113803
435.0NaNS8.0500Allen, Mr. William Henry05300373450

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

文章来源:https://blog.csdn.net/PyDarren/article/details/134975389
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。