Разбить список Pandas DF на отдельные столбцы python

#python #pandas #pyspark

#python #pandas #pyspark

Вопрос:

У меня есть pandas DF с вложенным столбцом, и я хотел бы разделить их на отдельные столбцы. (похоже, что explode не работает из-за этой вложенной структуры)

Ввод:

 
 --------- ----------------------------------------------------------------------------------------------------- 
|     col1|                                                                                                 col2|
 --------- ----------------------------------------------------------------------------------------------------- 
|      100|[('abc', 'customer'), ('product_b', 'product'), ('xyz','customer'), ('product_a', 'product')]        |
|      101|[('mno', 'customer')                                                                                 |
 --------- ----------------------------------------------------------------------------------------------------- 

Output:

 --------- ---------------- ------------------------- 
|     col1|        customer|                product  |      
 --------- ------------------------------------------ 
|      100|['abc', 'xyz']  |['product_b', 'product_a']
|      101|['mno']         |                         |
 --------- ------------------------------------------ 

root
 |-- col1: string (nullable = true)
 |-- col2: array (nullable = true)
 |    |-- element: string (containsNull = true)
  

Ответ №1:

Попробуйте использовать .pivot() и groupBy встроенные функции spark.

 l=[('abc', 'customer'), ('product_b', 'product'), ('xyz', 'customer'), ('product_a', 'product')]

from pyspark.sql.functions import *

spark.createDataFrame(l,['col1','col2']).
groupBy("col2").
agg(collect_list(col("col1")).alias("col1")).
groupBy(lit(1)).
pivot("col2").agg(first(col("col1"))).
drop("1").
show(10,False)
# ---------- ---------------------- 
#|customer  |product               |
# ---------- ---------------------- 
#|[abc, xyz]|[product_b, product_a]|
# ---------- ---------------------- 
  

Комментарии:

1. Спасибо! Список уже является столбцом в DF, и я пытаюсь сделать это для каждой строки. Например, список colA 1 [(‘abc’, ‘customer’), (‘product_b’, ‘product’), (‘xyz’, ‘customer’), (‘product_a’, ‘product’)] 2 [(‘abc’, ‘customer’), (‘product_b’, ‘product’)]

2. @thecoder, Не могли бы вы попробовать создать spark df из pandas df, затем распечатать схему с помощью: spark.createDataFrame(pandasDF).printSchema() и обновить вопрос с помощью схемы?

Ответ №2:

Давайте попробуем

 out = pd.DataFrame(input).groupby(1)[0].agg(list).to_frame().T
Out[170]: 
1    customer                 product
0  [abc, xyz]  [product_b, product_a]
  

Ответ №3:

Вот решение, использующее numpy, извлекающее значения и данные столбцов соответствующим образом, а затем создающее для них фрейм данных Pandas

 # Import packages
import numpy as np
import pandas as pd

# Load data into numpy array
data = np.array([('abc', 'customer'), ('product_b', 'product'), ('xyz', 'customer'), ('product_a', 'product')]).astype(str)

# Get all values (i.e product/customer name) and categories (product or customer)
values = data[:,0]
types = data[:,1]
categories = np.unique(types)

# Get customer and product names
customers = values[np.where(types == categories[0])[0]]        # This finds all the pairs with type customer
products = values[np.where(types == categories[1])[0]]         # This finds all the pairs with type product

# Put numpy data into DataFrame
d = {'Customer': customers.tolist(), 'Products': products.tolist()}
df = pd.DataFrame(data=d)