如何根据Pandas中的列“展开”行

时间:2018-10-17 17:30:21

标签: python pandas

此数据框的一列实际上是一个列表:

import pandas as pd
df = pd.DataFrame([
    {"a":"a1", "b":"['b11','b12','b13']"},
    {"a":"a2", "b":"['b21','b22','b23']"}
])

这就是:

    a                    b
0  a1  ['b11','b12','b13']
1  a2  ['b21','b22','b23']

我如何像这样展开它?

    a    b
0  a1  b11
1  a1  b12
2  a1  b13
3  a2  b21
4  a2  b22
5  a2  b23

我的第一个猜测是:

from functools import reduce
vls = df.apply(lambda x: [{'a': x['a'], 'b': b} for b in list(eval(x['b']))], axis=1).values
df = pd.DataFrame(reduce(lambda x, y: x + y, vls))

它可以工作,但是一小部分(〜1000行)数据却要花费大量时间,我必须将其应用于数百万行。

我想知道是否存在仅使用pandas api的更好方法。

1 个答案:

答案 0 :(得分:1)

尝试一下:

df.groupby('a').apply(lambda df: pd.DataFrame({'a':[df.a.iloc[0]] * len(eval(df.b.iloc[0])),'b': eval(df.b.iloc[0])}))

代替使用reduce,它使用groupby函数来扩展行-假设您的列是唯一的。