Pandas:根据名称中的分隔符拆分多值列

时间:2017-09-03 07:32:44

标签: python pandas split

我有一个庞大的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

2 个答案:

答案 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