我经常注意到这个问题。也就是说,如何将这个有列表的列拆分为多行?我见过它叫爆炸。以下是一些链接:
所以我写了一个函数来完成它。
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)
但在我们可以使用它之前,我们需要列中的列表(或可迭代的)。
设置
df = pd.DataFrame([['aa', 'assets', '100,200', '20121231,20131231'],
['bb', 'liabilities', '50,50', '20141231,20131231']],
columns=['ticker', 'account', 'value', 'date'])
df
拆分 value 和 date 列:
df.value = df.value.str.split(',')
df.date = df.date.str.split(',')
df
现在我们可以在任一列或两列上展开,一个接一个。
解决方案
explode(df, ['value','date'])
时间
我从@jezrael 的时间中删除了strip,因为我无法有效地将它添加到我的。这是此问题的必要步骤,因为 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'])
小 2 行样本
中等 200 行样本
2,000,000 行大样本