Pandas进阶之DataFrame行列拆分

数据


  • 需求:将Brands_rank列中的不同品牌名,单独列出来
  • 观察数据:不同的品牌名,由横杆(-)隔开,第3行只有1个横杆(-)
  • 为实现需求,可以将Brands_rank列拆为3列,或者将3行Brands_rank数据拆为8行。
# -*- coding:utf-8 -*-
import pandas as pd
import numpy as np

df
    Type        Brands_rank
0   Computer    Mac-Dell-Lenovo
1   Phone       Mac-XiaoMi-HuaWei
2   Pad         Mac-HuaWei


一列拆多列


  1. 获取Type
df_column = df.Type.to_frame()

print(df_column)
    Type
0   Computer
1   Phone
2   Pad
  1. 基于Brands_rank列构造多列
  • 方法一:当截取的内容长度和位置固定时,可直接使用字符串切片,本例中,以截取Brands_rankMac为例
df_column['Brands-First'] = df.Brands_rank.astype('str').str[0:3]

print(df_column)
    Type        Brands-First
0   Computer    Mac
1   Phone       Mac
2   Pad         Mac
  • 方法二:当截取的内容长度不固定时,如Brands_rank中横杆(-)的中间部分,字符串长度不一致,使用字符串分割函数split()
df_column['Brands-Second'] = df.Brands_rank.apply(lambda x: x.split('-')[1])  

print(df_column)
    Type      Brands-First  Brands-Second
0   Computer    Mac           Dell
1   Phone       Mac           XiaoMi
2   Pad         Mac           HuaWei
  • 方法三:当分隔符个数不同时,需要对分隔符的个数做判断,本例中是横杆(-),其个数不够2个时返回None。一列拆为3列的结果如下:
df_column['Brands-Third'] = df.Brands_rank.apply(lambda x: x.split('-')[2] if x.count('-') >= 2 else np.nan)  

print(df_column)
    Type      Brands-First  Brands-Second   Brands-Third
0   Computer     Mac            Dell          Lenovo
1   Phone        Mac           XiaoMi         HuaWei
2   Pad          Mac           HuaWei         NaN


一行拆多行


  1. 方法一:基于一列拆多列的结果,多次选取列再拼接。该方法容易理解,前提是需要先实现一列拆多列、代码冗余不优雅
df_index_1 = df_column[['Type', 'Brands-First']].rename(columns={'Brands-First':'Brands'})
df_index_2 = df_column[['Type', 'Brands-Second']].rename(columns={'Brands-Second':'Brands'})
df_index_3 = df_column[['Type', 'Brands-Third']].rename(columns={'Brands-Third':'Brands'})
df_index = pd.concat([df_index_1, df_index_2, df_index_3]).dropna().sort_index() 

print(df_index)
    Type        Brands
0   Computer    Mac
0   Computer    Dell
0   Computer    Lenovo
1   Phone       Mac
1   Phone       XiaoMi
1   Phone       HuaWei
2   Pad         Mac
2   Pad         HuaWei
  1. 方法二、直接对Brands_rank列进行分割(split),再堆叠(stack)处理,堆叠后会出现多级索引,删除多级索引后再拼接。3行拆分为8行的结果如下:
df_index = df.Brands_rank.str.split('-', expand=True).stack().to_frame() 
df_index = df_index.reset_index(level=1, drop=True).rename(columns={0:'Brands'}) 

df[['Type']].join(df_index) 

    Type        Brands
0   Computer    Mac
0   Computer    Dell
0   Computer    Lenovo
1   Phone       Mac
1   Phone       XiaoMi
1   Phone       HuaWei
2   Pad         Mac
2   Pad         HuaWei
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容