将多个列拆分为pandas数据帧中的行

cta*_*tan 6 split join multiple-columns dataframe pandas

我有一个pandas数据帧如下:

ticker    account      value         date
aa       assets       100,200       20121231, 20131231
bb       liabilities  50, 150       20141231, 20131231
Run Code Online (Sandbox Code Playgroud)

我想拆分df['value'],df['date']以便数据框看起来像这样:

ticker    account      value         date
aa       assets       100           20121231
aa       assets       200           20131231 
bb       liabilities  50            20141231
bb       liabilities  150           20131231
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助.

jez*_*ael 10

你可以先split列,创建Series通过stack并删除空格strip:

s1 = df.value.str.split(',', expand=True).stack().str.strip().reset_index(level=1, drop=True)
s2 = df.date.str.split(',', expand=True).stack().str.strip().reset_index(level=1, drop=True)
Run Code Online (Sandbox Code Playgroud)

然后concat双方Seriesdf1:

df1 = pd.concat([s1,s2], axis=1, keys=['value','date'])
Run Code Online (Sandbox Code Playgroud)

删除旧列value,并datejoin:

print (df.drop(['value','date'], axis=1).join(df1).reset_index(drop=True))
  ticker      account value      date
0     aa       assets   100  20121231
1     aa       assets   200  20131231
2     bb  liabilities    50  20141231
3     bb  liabilities   150  20131231
Run Code Online (Sandbox Code Playgroud)


piR*_*red 7

我经常注意到这个问题.也就是说,如何将具有列表的列拆分为多行?我见过它叫做爆炸.以下是一些链接:

所以我写了一个能做到的功能.

def explode(df, columns):
    idx = np.repeat(df.index, df[columns[0]].str.len())
    a = df.T.reindex_axis(columns).values
    concat = np.concatenate([np.concatenate(a[i]) for i in range(a.shape[0])])
    p = pd.DataFrame(concat.reshape(a.shape[0], -1).T, idx, columns)
    return pd.concat([df.drop(columns, axis=1), p], axis=1).reset_index(drop=True)
Run Code Online (Sandbox Code Playgroud)

但在我们使用它之前,我们需要列中的列表(或可迭代的).

建立

df = pd.DataFrame([['aa', 'assets',      '100,200', '20121231,20131231'],
                   ['bb', 'liabilities', '50,50',   '20141231,20131231']],
                  columns=['ticker', 'account', 'value', 'date'])

df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

拆分valuedate列:

df.value = df.value.str.split(',')
df.date = df.date.str.split(',')

df
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

现在我们可以在一列或两者上爆炸,一个接一个.

explode(df, ['value','date'])
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述


定时

strip从@ jezrael的时间中删除了因为我无法有效地将它添加到我的.这是此问题的必要步骤,因为OP在逗号后面的字符串中有空格.我的目标是提供一种通用的方法来爆炸列,因为它已经有了迭代,我想我已经完成了.

def get_df(n=1):
    return pd.DataFrame([['aa', 'assets',      '100,200,200', '20121231,20131231,20131231'],
                         ['bb', 'liabilities', '50,50',   '20141231,20131231']] * n,
                        columns=['ticker', 'account', 'value', 'date'])
Run Code Online (Sandbox Code Playgroud)

小2排样品

在此输入图像描述

中等200行样本

在此输入图像描述

大量2,000,000行样本

在此输入图像描述