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')
    
posted @ 2022-09-30 09:40  影伴  阅读(128)  评论(0)    收藏  举报