मेरे पास डेटाफ्रेम है। इसमें विभिन्न बिक्री आउटलेट में विभिन्न वस्तुओं की बिक्री की मात्रा शामिल है। नीचे दिखाया गया डेटाफ़्रेम कुछ बिक्री आउटलेट में केवल कुछ आइटम दिखाता है। प्रत्येक वस्तु के लिए प्रति दिन 100 वस्तुओं की बिक्री का एक बेंचमार्क है। प्रत्येक आइटम के लिए जो 100 से अधिक बेचा जाता है, इसे "हां" के रूप में चिह्नित किया जाता है और 100 से नीचे वाले को "नहीं" के रूप में चिह्नित किया जाता है।

val df1 = Seq(
("Mumbai", 90,  109, , 101, 78, ............., "No", "Yes", "Yes", "No", .....),
("Singapore", 149,  129, , 201, 107, ............., "Yes", "Yes", "Yes", "Yes", .....),
("Hawaii", 127,  101, , 98, 109, ............., "Yes", "Yes", "No", "Yes", .....),
("New York", 146,  130, , 173, 117, ............., "Yes", "Yes", "Yes", "Yes", .....),
("Los Angeles", 94,  99, , 95, 113, ............., "No", "No", "No", "Yes", .....),
("Dubai", 201,  229, , 265, 317, ............., "Yes", "Yes", "Yes", "Yes", .....),
("Bangalore", 56,  89, , 61, 77, ............., "No", "No", "No", "No", .....))
.toDF("Outlet","Boys_Toys","Girls_Toys","Men_Shoes","Ladies_shoes", ............., "BT>100", "GT>100", "MS>100", "LS>100", .....)

अब, मैं एक कॉलम "काउंट_ऑफ_यस" जोड़ना चाहता हूं जिसमें प्रत्येक बिक्री आउटलेट (प्रत्येक पंक्ति) के लिए, कॉलम "काउंट_ऑफ_यस" का मान उस पंक्ति में "हां" की कुल संख्या होगी। हां की गिनती पाने के लिए मैं प्रत्येक पंक्ति पर कैसे पुनरावृति करूं?

मेरा अपेक्षित डेटाफ्रेम होना चाहिए

val output_df = Seq(
("Mumbai", 90,  109, , 101, 78, ............., "No", "Yes", "Yes", "No", ....., 2),
("Singapore", 149,  129, , 201, 107, ............., "Yes", "Yes", "Yes", "Yes", ....., 4),
("Hawaii", 127,  101, , 98, 109, ............., "Yes", "Yes", "No", "Yes", ....., 3),
("New York", 146,  130, , 173, 117, ............., "Yes", "Yes", "Yes", "Yes", ....., 4),
("Los Angeles", 94,  99, , 95, 113, ............., "No", "No", "No", "Yes", ....., 1),
("Dubai", 201,  229, , 265, 317, ............., "Yes", "Yes", "Yes", "Yes", ....., 4),
("Bangalore", 56,  89, , 61, 77, ............., "No", "No", "No", "No", ....., 0))
.toDF("Outlet","Boys_Toys","Girls_Toys","Men_Shoes","Ladies_shoes", ............., "BT>100", "GT>100", "MS>100", "LS>100", ....., "Count_of_Yes")
1
Ope Baba 3 नवम्बर 2020, 19:24

2 जवाब

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

आप कॉलम की चुनी गई सूची को 1s ("हां" के लिए) और 0s ("नहीं" के लिए) के ऐरे में बदल सकते हैं और नीचे दिखाए गए अनुसार selectExpr का उपयोग करके SQL एक्सप्रेशन में एग्रीगेट के साथ सरणी तत्वों का योग करें:

val df = Seq(
  (1, 120, 80, 150, "Y", "N", "Y"),
  (2, 50, 90, 110, "N", "N", "Y"),
  (3, 70, 160, 90, "N", "Y", "N")
).toDF("id", "qty_a", "qty_b", "qty_c", "over100_a", "over100_b", "over100_c")

val cols = df.columns.filter(_.startsWith("over100_"))

df.
  withColumn("arr", array(cols.map(c => when(col(c) === "Y", 1).otherwise(0)): _*)).
  selectExpr("*", "aggregate(arr, 0, (acc, x) -> acc + x) as yes_count").
  show
// +---+-----+-----+-----+---------+---------+---------+---------+---------+
// | id|qty_a|qty_b|qty_c|over100_a|over100_b|over100_c|      arr|yes_count|
// +---+-----+-----+-----+---------+---------+---------+---------+---------+
// |  1|  120|   80|  150|        Y|        N|        Y|[1, 0, 1]|        2|
// |  2|   50|   90|  110|        N|        N|        Y|[0, 0, 1]|        1|
// |  3|   70|  160|   90|        N|        Y|        N|[0, 1, 0]|        1|
// +---+-----+-----+-----+---------+---------+---------+---------+---------+

वैकल्पिक रूप से, explode और groupBy/agg का उपयोग Array तत्वों का योग करने के लिए करें:

df.
  withColumn("arr", array(cols.map(c => when(col(c) === "Y", 1).otherwise(0)): _*)).
  withColumn("flattened", explode($"arr")).
  groupBy("id").agg(sum($"flattened").as("yes_count"))
1
Leo C 4 नवम्बर 2020, 03:52

हां की गिनती पाने के लिए मैं प्रत्येक पंक्ति पर कैसे पुनरावृति करूं? आप प्रत्येक रिकॉर्ड को बदलने के लिए मानचित्र परिवर्तन का उपयोग कर सकते हैं। तो आपके मामले में df.map() में हाँ की संख्या गिनने के लिए कोड होना चाहिए और एक नया रिकॉर्ड उत्सर्जित करना चाहिए जिसमें यह अतिरिक्त कॉलम हो।

छद्म कोड इस प्रकार है -

df.map(count number of YES and append that at the end of the string")
0
Amit 3 नवम्बर 2020, 20:22