Hướng dẫn dùng python flatmap python

Tôi thấy mình muốn làm phẳng một mảng các mảng trong khi viết một số mã Python vào đầu giờ chiều nay và lười biếng với nỗ lực đầu tiên của tôi liên quan đến việc xây dựng mảng phẳng bằng tay:

episodes = [
    {"id": 1, "topics": [1,2,3]},
    {"id": 2, "topics": [4,5,6]}
]

flattened_episodes = []
for episode in episodes:
    for topic in episode["topics"]:
        flattened_episodes.append({"id": episode["id"], "topic": topic})

for episode in flattened_episodes:
    print episode

Nếu chúng ta chạy mà chúng ta sẽ thấy đầu ra này:

$ python flatten.py

{'topic': 1, 'id': 1}
{'topic': 2, 'id': 1}
{'topic': 3, 'id': 1}
{'topic': 4, 'id': 2}
{'topic': 5, 'id': 2}
{'topic': 6, 'id': 2}

Điều tôi thực sự tìm kiếm là Python tương đương với hàm phẳng mà tôi đã học có thể đạt được trong Python với cách hiểu danh sách như vậy:

flattened_episodes = [{"id": episode["id"], "topic": topic}
                      for episode in episodes
                      for topic in episode["topics"]]

for episode in flattened_episodes:
    print episode

Chúng tôi cũng có thể chọn sử dụng itertools trong trường hợp chúng tôi có mã sau đây:

from itertools import chain, imap
flattened_episodes = chain.from_iterable(
                        imap(lambda episode: [{"id": episode["id"], "topic": topic}
                                             for topic in episode["topics"]],
                             episodes))
for episode in flattened_episodes:
    print episode

Sau đó, chúng ta có thể đơn giản hóa cách tiếp cận này một chút bằng cách gói nó trong một chức năng 'phẳng':

def flatmap(f, items):
        return chain.from_iterable(imap(f, items))

flattened_episodes = flatmap(
    lambda episode: [{"id": episode["id"], "topic": topic} for topic in episode["topics"]], episodes)

for episode in flattened_episodes:
    print episode

Tôi nghĩ rằng cách tiếp cận hiểu danh sách vẫn hoạt động nhưng tôi cần xem xét itertools nhiều hơn - có vẻ như nó có thể hoạt động tốt cho các hoạt động danh sách khác.

  • big data
  • python
  • bigdata
  • dữ liệu lớn
  • mảng

5 hữu ích 0 bình luận 3.8k xem chia sẻ

Theo mặc định, hành động thu thập () của PySpark DataFrame trả về kết quả trong Loại hàng () nhưng không phải danh sách, do đó bạn cần chuyển đổi trước bằng cách sử dụng chuyển đổi map () hoặc xử lý sau để chuyển đổi Cột PySpark DataFrame thành Danh sách Python, có nhiều các cách để chuyển đổi cột DataFrame (tất cả các giá trị) sang Python liệt kê một số cách tiếp cận hoạt động tốt hơn, một số phương pháp không thực hiện tốt hơn, do đó tốt hơn là bạn nên biết tất cả các cách.

Một danh sách là một cấu trúc dữ liệu trong Python chứa một tập hợp các mục. Các mục danh sách được đặt trong dấu ngoặc vuông, như thế này [data1, data2, data3].


from pyspark.sql import SparkSession
spark = SparkSession.builder.master("local[1]") 
                    .appName('SignalFix.com') 
                    .getOrCreate()

data = [("James","Smith","USA","CA"),("Michael","Rose","USA","NY"), 
    ("Robert","Williams","USA","CA"),("Maria","Jones","USA","FL") 
  ]
columns=["firstname","lastname","country","state"]
df=spark.createDataFrame(data=data,schema=columns)
print(df.collect())

#Outputs below Row Type
#[Row(firstname="James", lastname="Smith", country='USA', state="CA"), Row(firstname="Michael", #lastname="Rose", country='USA', state="NY"), Row(firstname="Robert", lastname="Williams", country='USA', #state="CA"), Row(firstname="Maria", lastname="Jones", country='USA', state="FL")]

Ghi chú: Hành động thu thập () thu thập tất cả các hàng từ tất cả các công nhân vào Trình điều khiển PySpark, nếu dữ liệu của bạn lớn và không vừa trong bộ nhớ Trình điều khiển, nó sẽ trả về lỗi Outofmemory, do đó, hãy cẩn thận khi bạn sử dụng thu thập.

  • 1. Chuyển đổi DataFrame Column thành Python List
    • 1.1 Xóa các bản sao khỏi danh sách
  • 2. Tên cột giới thiệu bạn muốn trích xuất
  • 3. Sử dụng phép chuyển đổi flatMap ()
  • 4. Chuyển đổi sang danh sách Python bằng Pandas
  • 5. Lấy cột trong loại hàng
  • 6. Chuyển đổi nhiều cột thành danh sách Python
    • Sự kết luận
    • Người giới thiệu

Như bạn thấy đầu ra ở trên, PySpark DataFrame collect () trả về Loại hàng, do đó, để chuyển đổi Cột DataFrame thành Danh sách Python, trước tiên, bạn cần chọn cột DataFrame bạn muốn bằng cách sử dụng biểu thức lambda rdd.map () và sau đó thu thập DataFrame . Trong ví dụ dưới đây, tôi đang trích xuất cột thứ 4 (chỉ mục thứ 3) từ DataFrame vào danh sách Python.


states1=df.rdd.map(lambda x: x[3]).collect()
print(states1)
#['CA', 'NY', 'CA', 'FL']

1.1 Xóa các bản sao khỏi danh sách

Đoạn mã trên chuyển đổi cột DataFrame thành một danh sách Python, tuy nhiên, nó chứa các giá trị trùng lặp, bạn có thể xóa các bản sao trước hoặc sau khi chuyển đổi thành Danh sách. Ví dụ dưới đây loại bỏ các bản sao khỏi danh sách Python sau khi chuyển đổi.


#Remove duplicates after converting to List
from collections import OrderedDict 
res = list(OrderedDict.fromkeys(states1)) 
print(res)
#['CA', 'NY', 'FL']

2. Tên cột giới thiệu bạn muốn trích xuất

Đây là một giải pháp thay thế khác để lấy cột DataFrame làm Danh sách Python bằng cách tham chiếu tên cột từ Loại hàng.


states2=df.rdd.map(lambda x: x.state).collect()
print(states2)
#['CA', 'NY', 'CA', 'FL']

3. Sử dụng phép chuyển đổi flatMap ()

Bạn cũng có thể lấy danh sách từ DataFrame bằng cách sử dụng phép biến đổi PySpark flatMap ()


states4=df.select(df.state).rdd.flatMap(lambda x: x).collect()
print(states4)
#['CA', 'NY', 'CA', 'FL']

4. Chuyển đổi sang danh sách Python bằng Pandas

Ví dụ dưới đây Chuyển đổi PySpark DataFrame thành Gấu trúc và sử dụng gấu trúc để lấy cột bạn muốn dưới dạng Danh sách Python.


states5=df.select(df.state).toPandas()['state']
states6=list(states5)
print(states6)
#['CA', 'NY', 'CA', 'FL']

5. Lấy cột trong loại hàng

Trong trường hợp nếu bạn muốn thu thập cột DataFrame trong Loại Hàng, hãy sử dụng ví dụ dưới đây.


states3=df.select(df.state).collect()
print(states3)
#[Row(state="CA"), Row(state="NY"), Row(state="CA"), Row(state="FL")]

6. Chuyển đổi nhiều cột thành danh sách Python


pandDF=df.select(df.state,df.firstname).toPandas()
print(list(pandDF['state']))
print(list(pandDF['firstname']))
#['CA', 'NY', 'CA', 'FL']
#['James', 'Michael', 'Robert', 'Maria']

Sự kết luận

Trong bài viết này, tôi đã giải thích một số cách để lấy Danh sách Python từ DataFrame với ví dụ. hy vọng những điều này là hữu ích.

Học vui vẻ !!

Người giới thiệu