我有一个庞大的Pandas数据框,其中有许多多值列。这些列有" /"在他们的名字中,这些列中的值也由" /"分隔。以下是此类数据框的最小代表性示例。
Name North / South East / West No1 / No2 / No3
0 ABC 0 / 1 0 / 0 10 / 3 / 6
1 XYZ 1 / 0 0 / 1 4 / 5 / 6
2 PQR 1 / 0 0 / 1 3 / 6 / 6
我想拆分列。直接的方法是创建一个新列,然后沿着索引的长度进行迭代,使用沿每个元素分割的字符串填充它。但我必须对所有多值列进行硬编码。
有更通用的方法吗?也许扫描df.columns然后如果一个元素包含" /"在其中,运行另一个功能来分解该列?对于上述数据帧,所需的输出如下。
Name North South East West No1 No2 No3
0 ABC 0 1 0 0 10 3 6
1 XYZ 1 0 0 1 4 5 6
2 PQR 1 0 0 1 3 6 6
答案 0 :(得分:1)
这是一种方法
In [1417]: pd.concat([s.str.split(' / ').apply(pd.Series, index=c.split(' / '))
for c, s in df.set_index('Name').iteritems()],
axis=1).reset_index()
Out[1417]:
Name North South East West No1 No2 No3
0 ABC 0 1 0 0 10 3 6
1 XYZ 1 0 0 1 4 5 6
2 PQR 1 0 0 1 3 6 6
答案 1 :(得分:0)
df = pd.concat([df]*1000).reset_index(drop=True)
print (df)
def f(df):
return pd.concat([s.str.split(' / ').apply(pd.Series, index=c.split(' / ')) for c, s in df.set_index('Name').iteritems()], axis=1).reset_index()
print (f(df))
def f1(df):
cols = df.columns[~df.columns.str.contains('/')].tolist()
df = df.set_index(cols)
c = df.columns.to_series().str.split(' / ', expand=True).stack().values.tolist()
df = pd.concat([df[x].str.split(' / ', expand=True) for x in df], axis=1)
df.columns = c
return df.reset_index()
print (f1(df))
In [142]: %timeit (f(df))
1 loop, best of 3: 2.6 s per loop
In [143]: %timeit (f1(df))
10 loops, best of 3: 27.5 ms per loop
<强>计时强>:
TimeLine