我有以下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
答案 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