pandas之多重影分身

pandas将一个字段拆分成多行

因工作需要最近刚刚接触pandas,水平较菜,工作中总是遇到一些问题,在此记录一下。如有错误欢迎指正。

需求分析

  • 工作中遇到了这样的数据,所有的数据都连在了一起,通过 ‘,’ 或者 ‘-’ 等一些特色字符分割开来,但是使用时又必须要把他们拆分成不同的行
  • 感觉有点像是细胞分裂,只不过细胞分裂是一分为二,而这却可以一分为多个,或者说是“多重影分身”更加贴切吧!以后这种需求就简称为“多重影分身”吧!哈哈~~~
  • 数据如下:
  • 预期的数据如下:

    解决方案

    方法一:
    def deal_data_df(data_df):
      data_df: pd.DataFrame
     
      province_list = []
      city_list = []
      for i in list(zip(data_df['Province'], data_df['City'])):
          for com in i[1].split(','):
              city_list.append(com)
              province_list.append(i[0])
    
      province_list_ = []
      city_list_ = []
    
      for i in list(set(zip(province_list, city_list))):
          province_list_.append(i[0])
          city_list_.append(i[1])
      data_df = pd.DataFrame({"Province": province_list_, "City": city_list_})
    
      return data_df
    
    方法二:
    def deal_data_df1(data_df):
      data_df: pd.DataFrame
    
      data_df = data_df.drop(['City'], axis=1).join(data_df['City'].str.split(',', expand=True).stack().reset_index(level=1, drop=True).rename('City')).drop_duplicates()
      return data_df
    
    方法三:
    def deal_data_df2(data_df):
      data_df: pd.DataFrame
      #一、先将‘City’字段拆分
      data_df['City'] = data_df['City'].map(lambda x: x.split(','))
      #二、然后直接调用explode()方法
      data_df = df.explode('City')
      return data_df
    

解释说明:

  • 方法一较为简单用一些python的基础知识就可以做出来,在此不再赘述。我们将重点放在用pandas处理此类问题。

  • 方法二代码解析:

    1. 第一步:拆分,生成多列  
    data_df_city = data_df['City'].str.split(',', expand=True)
    2. 第二步:行转列
    data_df_city = data_df_city.stack()
    3. 第三步:重置索引,并命名(并删除多于的索引)
    data_df_city = data_df_city.reset_index(level=1, drop=True)
    4. 第四步:和原始数据合并
    data_new = data_df.drop(['city'], axis=1).join(info_city)
    5. 第五步:去除重复行 
    data_df = data_new.drop_duplicates()
    
  • 方法三解释:

    使用pandas中自带的explode( )方法也可以实现行扩展。
    但是需要注意的是,该方法只有在高版本(0.25)的pandas中才可以使用。
    代码如下:
    
    #一、先将‘City’字段拆分
    data_df['City'] = data_df['City'].map(lambda x: x.split(','))
    #二、然后直接调用explode()方法
    data_df = df.explode('City')
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值