#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)