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')