【问题标题】:explode each column of dataframe without data duplication在没有数据重复的情况下爆炸数据框的每一列
【发布时间】:2022-01-19 16:49:00
【问题描述】:

我正在使用 pyspark 或 pandas

我有这个数据框,每一列都包含一个值列表:

COL1      |  COL2               |  COL3
["A","B"] |  ["V1", "V2", "V3"] |  ["V4","V5"]

我需要分解每一列以不同的方式呈现数据并生成这个数据框,列之间没有数据顺序:

COL1      |  COL2               |  COL3
A         |    V1               |   V4
B         |    V2               |   V5
null      |    V3               |   null

感谢您的帮助

【问题讨论】:

  • this 的可能重复项。

标签: pandas dataframe numpy pyspark


【解决方案1】:

试试这个:

df = df.apply(lambda row: row.apply(lambda cell: cell + [np.nan] * (max(row.apply(len)) - len(cell))), axis=1).explode(df.columns.tolist())

输出:

>>> df
  COL1 COL2 COL3
0    A   V1   V4
0    B   V2   V5
0  NaN   V3  NaN

【讨论】:

    【解决方案2】:

    使用pd.concat:

    out = pd.concat([sr.explode(ignore_index=True) for _, sr in df.iteritems()], axis=1)
    print(out)
    
    # Output:
      COL1 COL2 COL3
    0    A   V1   V4
    1    B   V2   V5
    2  NaN   V3  NaN
    

    【讨论】:

      【解决方案3】:

      使用 Spark 内置函数 arrays_zip and explode 获得所需的输出。

      Example:

      df.select(explode(arrays_zip(col("col1"),col("col2"),col("col3")))).\
      select("col.*").\
      show(10,False)
      
      #+----+----+----+
      #|col1|col2|col3|
      #+----+----+----+
      #|a   |v1  |v4  |
      #|b   |v2  |v5  |
      #|null|v3  |null|
      #+----+----+----+
      

      【讨论】:

        猜你喜欢
        • 2021-08-20
        • 2022-01-27
        • 2019-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 2022-06-14
        • 1970-01-01
        相关资源
        最近更新 更多