【问题标题】:How to "unfold" rows according to a column in Pandas [duplicate]如何根据 Pandas 中的列“展开”行 [重复]
【发布时间】:2019-03-22 11:13:53
【问题描述】:

这个数据框有一列实际上是一个列表:

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 的更好方法。

【问题讨论】:

    标签: python pandas


    【解决方案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 函数来扩展行 - 假设您的 a 列是唯一的。

    【讨论】:

    • 快得多!谢谢!
    猜你喜欢
    • 2021-08-13
    • 2020-07-21
    • 2020-12-16
    • 1970-01-01
    • 2021-12-06
    • 2020-12-11
    • 1970-01-01
    • 2016-05-05
    相关资源
    最近更新 更多