熊猫:将细胞分裂成多个列,写为NaN

时间:2019-06-04 14:10:55

标签: python pandas dataframe

我有以下df

df = pd.DataFrame({'Category': ['root:catA', 'root:catA:catB'], 'Age':[32, 34]})

现在,我想将Category列中的:分成4列。由于row0将导致4个填充列,而row1将在5个填充列中填充,因此列数将减少,因此其余列应使用NaN填充。

预期输出:

df = pd.DataFrame({'Category': ['root:catA', 'root:catA:catB'], 'Age':[32, 34], 'Cat1':['root', 'root'], 'Cat2':['catA', 'catA'], 'Cat3':['NaN', 'CatB'], 'Cat4':['NaN', 'NaN']})

我尝试了以下操作:

df[['cat1','cat2', "cat3", "cat4"]] = df.Category.str.split(":",expand=True)

但是我得到一个 ValueError: Columns must be same length as key

2 个答案:

答案 0 :(得分:5)

几乎在那儿,您只需要执行一个额外的重新索引步骤:

df['Category'].str.split(':', expand=True).reindex(range(4), axis=1)                                                   

      0     1     2   3
0  root  catA  None NaN
1  root  catA  catB NaN

现在,分配将起作用。

或者,join将它们在一起。

(df['Category'].str.split(':', expand=True)
               .reindex(range(4), axis=1)
               .rename(lambda x: f'cat{x+1}', axis=1)
               .join(df))

   cat1  cat2  cat3  cat4        Category  Age
0  root  catA  None   NaN       root:catA   32
1  root  catA  catB   NaN  root:catA:catB   34

答案 1 :(得分:0)

您的扩展仅提供3列,您需要删除Cat4并在以后分配:

df[['cat1','cat2', "cat3"]] = df.Category.str.split(':', expand=True)
df['cat4'] = np.nan