मैं डास्क डेटाफ़्रेम में सभी पंक्तियों पर एक फ़ंक्शन लागू कर रहा हूं। PySpark में परिणामी DataFrame के लिए एक संरचित पंक्ति बनाने के लिए मैं नामित पैरामीटर के साथ एक spark.sql.Row ऑब्जेक्ट वापस करने में सक्षम हूं। डैस्क डेटाफ़्रेम में पंक्तियों पर फ़ंक्शन लागू करते समय मैं एक समान संरचित पंक्ति (कॉलम और प्रकारों के साथ) कैसे वापस कर सकता हूँ?

मैं इन पंक्तियों के साथ कुछ ढूंढ रहा हूं:

# df is a dask.dataframe with a JSON blob in the `data` column

def process(row):
    json_data = json.loads(row.data)
    return Row(a=json_data["a"], b=json_data["b")

result = df.apply(
    process,
    axis=1,
).compute()

result

मैं देखता हूं कि पंक्तियां स्वयं pd.Series हैं, इसलिए मैंने process को Series लौटाने का प्रयास किया, लेकिन मुझे यह त्रुटि मिली

AttributeError: 'Series' object has no attribute 'columns'

दस्तावेज़ीकरण a> सुझाव देता है कि मैं apply में meta पैरामीटर का उपयोग कर सकता हूं:

मेटा: एक खाली pd.DataFrame या pd.Series जो आउटपुट के dtypes और कॉलम नामों से मेल खाता है ... [इनपुट जैसे] चलने योग्य (name, dtype) प्रदान किया जा सकता है (ध्यान दें कि नामों का क्रम ऑर्डर से मेल खाना चाहिए) स्तंभों में से)

हालाँकि जब मैं मेटा टुपल्स के iterable का उपयोग करता हूं, जैसा कि सुझाव दिया गया है

result = df.apply(
    process,
    axis=1,
    meta=[("a", "int")]
).compute()

यह एक DataFrame वस्तु की अपेक्षा कर रहा है और यह त्रुटि लौटाता है

AttributeError: 'DataFrame' object has no attribute 'name'
1
Nevermore 6 अक्टूबर 2021, 22:14
आपको यह उत्तर मददगार लग सकता है: stackoverflow.com/a/31364127/11390523
 – 
Pavithra
8 अक्टूबर 2021, 15:45

1 उत्तर

सबसे बढ़िया उत्तर

यह यहां विकसित किए गए पांडा फ़ंक्शन के चारों ओर एक डस्क रैपर है:

# see unutbu's answer here: https://stackoverflow.com/a/25512372/10693596
import json
def json_to_series(text):
    keys, values = zip(*[item for dct in json.loads(text) for item in dct.items()])
    return pd.Series(values, index=keys)


def process_chunk(df):
    _tmp = df['data'].apply(json_to_series)
    return pd.concat([df, _tmp], axis=1)

result = df.map_partitions(process_chunk).compute()
2
SultanOrazbayev 7 अक्टूबर 2021, 11:01