【问题标题】:Split rows to create new rows in Pandas Dataframe拆分行以在 Pandas Dataframe 中创建新行
【发布时间】:2021-09-20 11:47:22
【问题描述】:

我有一个 pandas 数据框,其中一列文本字符串包含多个逗号分隔的值。我想拆分每个字段并仅在逗号数等于 2 的情况下为每个条目创建一个新行。我的整个数据框只有任何一个没有的值。逗号 =1 或 2。 例如,a 应该变成 b:

In [7]: a
Out[7]: 
    var1   var2   var3
0  a,b,c     1     X
1  d,e,f     2     Y
2  g,h       3     Z
In [8]: b
Out[8]: 
     var1  var2   var3
0    a,c     1     X
1    b,c     1     X
2    d,f     2     Y
3    e,f     2     Y
4    g,h     3     Z

【问题讨论】:

    标签: python-3.x pandas dataframe python-2.7 split


    【解决方案1】:

    这是另一种方式:

    df2 = df.loc[df['var1'].str.count(',').eq(2)]
    
    s = (df2.assign(var1 = df2['var1'].str.split(','))
         .explode('var1').groupby(level=0)
         .agg(one = ('var1',lambda x: x.iloc[0] +','+ x.iloc[-1]),
              two = ('var1',lambda x: x.iloc[1] +','+ x.iloc[-1]))
         .stack().droplevel(1))
    
    df2 = (pd.concat([df.loc[s.index].assign(var1 = s.to_numpy()),
                      df.loc[df['var1'].str.count(',').eq(1)]],ignore_index=True))
    

    【讨论】:

      【解决方案2】:

      根据您的评论,var1 列只有 1 或 2 个逗号:

      def fn(x):
          x = x.split(",")
          if len(x) == 2:
              return [",".join(x)]
          return ["{},{}".format(x[0], x[2]), "{},{}".format(x[1], x[2])]
      
      
      df = df.assign(var1=df["var1"].apply(fn)).explode("var1").reset_index(drop=True)
      print(df)
      

      打印:

        var1  var2 var3
      0  a,c     1    X
      1  b,c     1    X
      2  d,f     2    Y
      3  e,f     2    Y
      4  g,h     3    Z
      

      【讨论】:

        【解决方案3】:

        我分两步做:首先,当有两个逗号时转换第一列,引入一个字符串元组(这是通过将func应用于第一列来完成的,每个s是一个单元格字符串内容)。然后使用explode 将这些元组变成几行。

        def func(s):
            t = s.split(',')
            return s if len(t) == 2 else (f'{t[0]},{t[2]}', f'{t[1]},{t[2]}')
        
        df.var1 = df.var1.apply(func)
        df = df.explode('var1').reset_index(drop=True)
        

        【讨论】:

          【解决方案4】:
          • 已经采取了您想要组合组成部分的方法
          • 具体来说,您要排除一个组合
          • 为了解决方案的透明度而使用了一个额外的列
          import io
          import itertools
          
          df = pd.read_csv(io.StringIO("""    var1   var2   var3
          0  a,b,c     1     X
          1  d,e,f     2     Y
          2  g,h       3     Z"""), sep="\s+")
          
          df["var1_2"] = df["var1"].str.split(",").apply(lambda x: [",".join(list(c)) 
                                                                    for c in itertools.combinations(x, 2) 
                                                                    if len(x)<=2 or list(c) != x[:2]])
          df.explode("var1_2")
          
          
          var1 var2 var3 var1_2
          a,b,c 1 X a,c
          a,b,c 1 X b,c
          d,e,f 2 Y d,f
          d,e,f 2 Y e,f
          g,h 3 Z g,h

          【讨论】:

            猜你喜欢
            • 2021-11-28
            • 1970-01-01
            • 1970-01-01
            • 2019-04-22
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多