【问题标题】:How to duplicate rows in pandas, based on items in a list [duplicate]如何根据列表中的项目复制熊猫中的行[重复]
【发布时间】:2013-04-03 20:31:32
【问题描述】:

我有一个看起来像这样的 pandas 数据框:

COL     data
line1   [A,B,C]

其中数据列中的项目可以是列表,也可以只是逗号分隔的元素。有没有简单的获取方式:

COL     data
line1   A
line1   B
line1   C

我可以遍历列表并通过 python 手动复制行,但是有一些 magic pandas 技巧可以做到这一点吗?关键是如何自动复制行。

谢谢!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    你可以写一个简单的清理函数让它成为一个列表(假设它不是一个逗号列表,你不能简单地使用ast.literal_eval):

    def clean_string_to_list(s):
        return [c for c in s if c not in '[,]']  # you might need to catch errors
    
    df['data'] = df['data'].apply(clean_string_to_list)
    

    遍历行似乎是一个合理的选择:

    In [11]: pd.DataFrame([(row['COL'], d)
                           for d in row['data']
                           for _, row in df.iterrows()],
                           columns=df.columns)
    Out[11]:
         COL data
    0  line1    A
    1  line1    B
    2  line1    C
    

    恐怕我认为 pandas 不适合这种操纵。

    【讨论】:

    • “row”和“row['COL']”从何而来?
    • @AlexanderSupertramp 在列表理解内for _, row in df.iterrows()。 _ 是行的索引,行是作为系列的 df 的行。
    • 这对我来说不起作用;我需要切换两个forstatements:[(row['COL'], d) for _, row in df.iterrows() for d in row['data']]
    • @AndyHayden,请更正您的答案。对我来说,也只有 RafG 答案有效。
    【解决方案2】:

    您可以使用df.explode() 选项。请参阅documentation。我相信这正是您需要的功能。

    【讨论】:

      猜你喜欢
      • 2023-01-11
      • 1970-01-01
      • 2020-12-10
      • 1970-01-01
      • 2021-05-04
      • 2020-06-02
      • 2021-04-26
      • 2019-03-20
      • 1970-01-01
      相关资源
      最近更新 更多