【问题标题】:split rows in pandas dataframe在熊猫数据框中拆分行
【发布时间】:2020-02-19 17:28:39
【问题描述】:

我遇到了如何逐行划分 pandas 数据帧的问题,

我有类似的数据框,其中值由 \r\n 分隔并且它们在一个单元格中,

    Color                              Shape  Price
0  Green  Rectangle\r\nTriangle\r\nOctangle     10
1   Blue              Rectangle\r\nTriangle     15 

我需要将这个单元格划分为其他列具有相同值的几个单元格,就像这里

   Color      Shape  Price
0  Green  Rectangle     10
1  Green   Triangle     10
2  Green   Octangle     10
3   Blue  Rectangle     15
4   Blue    Tringle     15

如何做得更好?

【问题讨论】:

  • 试试df.Shape.str.split(expand=True).stack()。这有帮助吗?
  • 拆分后看explode()
  • @anky_91explode() 是在0.25版本中添加的,在旧版本中还有其他方法可以解决吗?

标签: python pandas


【解决方案1】:

这可能不是最有效的方法,但我可以确认它适用于示例 df:

data = [['Green', 'Rectangle\r\nTriangle\r\nOctangle', 10], ['Blue', 'Rectangle\r\nTriangle', 15]]   
df = pd.DataFrame(data, columns = ['Color', 'Shape', 'Price'])
new_df = pd.DataFrame(columns = ['Color', 'Shape', 'Price'])

for index, row in df.iterrows():
    split = row['Shape'].split('\r\n')
    for shape in split:
        new_df = new_df.append(pd.DataFrame({'Color':[row['Color']], 'Shape':[shape], 'Price':[row['Price']]}))

new_df = new_df.reset_index(drop=True)
print(new_df)

输出:

   Color Price      Shape
0  Green    10  Rectangle
1  Green    10   Triangle
2  Green    10   Octangle
3   Blue    15  Rectangle
4   Blue    15   Triangle

【讨论】:

    【解决方案2】:

    正如评论,str.split() 后跟 explode 很有帮助。如果你不在 Pandas 0.25 上,那么你可以在之后使用melt

    (pd.concat( (df.Shape.str.split('\r\n', expand=True), 
                df[['Color','Price']]),
              axis=1)
       .melt(id_vars=['Color', 'Price'], value_name='Shape')
       .dropna()
    )
    

    输出:

       Color  Price variable      Shape
    0  Green     10        0  Rectangle
    1   Blue     15        0  Rectangle
    2  Green     10        1   Triangle
    3   Blue     15        1   Triangle
    4  Green     10        2   Octangle
    

    【讨论】:

      【解决方案3】:

      首先,您需要用空格分割形状,这将为您提供形状列表。然后,使用df.explode 解压缩列表并为每个列表创建新行

      df["Shape"] = df.Shape.str.split()
      df.explode("Shape")
      

      【讨论】:

        【解决方案4】:

        你可以这样做:

        df["Shape"]=df["Shape"].str.split("\r\n")
        print(df.explode("Shape").reset_index(drop=True))
        

        输出:

           Color    Shape   Price
        0   Green   Rectangle   10
        1   Green   Triangle    10
        2   Green   Octangle    10
        3   Blue    Rectangle   15
        4   Blue    Triangle    15
        

        【讨论】:

        • 我用一个示例 df 尝试了这个,我得到了 AttributeError: 'DataFrame' object has no attribute 'explode'。您是否有一些导入的库允许您这样做?
        • 我认为您使用的是不同的pandas 版本。 explode 是在 0.25 之后引入的。
        • 谢谢 Akshay,我有 0.24,我得更新 pandas
        猜你喜欢
        • 1970-01-01
        • 2013-06-23
        • 2019-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-03
        • 2019-05-29
        相关资源
        最近更新 更多