【问题标题】:Split any number of numpy array rows into columns in a Pandas Dataframe [duplicate]将任意数量的 numpy 数组行拆分为 Pandas Dataframe 中的列 [重复]
【发布时间】:2020-08-15 14:08:05
【问题描述】:

我有一个 Pandas 数据框,其中包含两种类型的列,一种包含 numpy 数组,另一种包含浮点数。

例如:

      arr1   f1
[0.3, 1.3]  3.5

我需要将数组的值分成行。

如果我只有这两列,我可以像这样轻松拆分数组:

df = pd.DataFrame([[x, j] for i, j in zip(a['arr1'], a['f1']) for x in list(i)], columns=['arr1', 'df1])

结果如下:

arr1   f1
0.3   3.5
1.3   3.5

但是,我可以有任意数量的数组和浮点列,其中同一行中的数组始终具有相同的长度,即:我可以匹配两个数组的所有元素((a1, b1), (a2, b2), ..., (a_n, b_n))

      arr1   f1        arr2  f2
[0.3, 1.3]  3.5 [14.8, 1.2] 1.6

拆分数组后,结果应如下所示:

arr1   f1  arr2  f2
 0.3  3.5  14.8 1.6
 1.3  3.5  1.2  1.6

很容易知道一列有什么样的数据,因此我可以相应地使用 zip,但无论如何我不知道如何使它适用于任意数量的列。

【问题讨论】:

    标签: python arrays pandas numpy dataframe


    【解决方案1】:

    列的顺序很重要时的解决方案 - 使用 DataFrame.explode 的列表推导:

    dfs = [df[list(x)].explode(x[0]) for x in zip(df.columns[::2], df.columns[1::2])]
    
    df = pd.concat(dfs, axis=1).reset_index(drop=True)
    print (df)
      arr1   f1  arr2   f2
    0  0.3  3.5  14.8  1.6
    1  1.3  3.5   1.2  1.6
    

    你的解决方案:

    dfs = [pd.DataFrame([[a, j] for i, j in zip(df[x[0]], 
                                                df[x[1]]) for a in i], columns=x) 
                        for x in zip(df.columns[::2], df.columns[1::2])]
    
    df = pd.concat(dfs, axis=1)
    print (df)
       arr1   f1  arr2   f2
    0   0.3  3.5  14.8  1.6
    1   1.3  3.5   1.2  1.6
    

    【讨论】:

      【解决方案2】:

      让我们试试unnesting

      df = unnesting(df, ['arr1','arr2'] , axis=1)
      

      def unnesting(df, explode, axis):
          if axis==1:
              idx = df.index.repeat(df[explode[0]].str.len())
              df1 = pd.concat([
                  pd.DataFrame({x: np.concatenate(df[x].values)}) for x in explode], axis=1)
              df1.index = idx
      
              return df1.join(df.drop(explode, 1), how='left')
          else :
              df1 = pd.concat([
                               pd.DataFrame(df[x].tolist(), index=df.index).add_prefix(x) for x in explode], axis=1)
              return df1.join(df.drop(explode, 1), how='left')
      

      【讨论】:

      • 所以不关闭?为什么?
      • @jezrael 如你所料~关闭
      • 好的,回答的时间被浪费了:(
      猜你喜欢
      • 2018-12-27
      • 2019-05-05
      • 1970-01-01
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2019-03-10
      • 2015-10-25
      • 2018-01-01
      相关资源
      最近更新 更多