मेरे पास डेटाफ्रेम है। इसमें विभिन्न बिक्री आउटलेट में विभिन्न वस्तुओं की बिक्री की मात्रा शामिल है। नीचे दिखाया गया डेटाफ़्रेम कुछ बिक्री आउटलेट में केवल कुछ आइटम दिखाता है। प्रत्येक वस्तु के लिए प्रति दिन 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")
2 जवाब
आप कॉलम की चुनी गई सूची को 1
s ("हां" के लिए) और 0
s ("नहीं" के लिए) के ऐरे
में बदल सकते हैं और नीचे दिखाए गए अनुसार 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"))
हां की गिनती पाने के लिए मैं प्रत्येक पंक्ति पर कैसे पुनरावृति करूं? आप प्रत्येक रिकॉर्ड को बदलने के लिए मानचित्र परिवर्तन का उपयोग कर सकते हैं। तो आपके मामले में df.map() में हाँ की संख्या गिनने के लिए कोड होना चाहिए और एक नया रिकॉर्ड उत्सर्जित करना चाहिए जिसमें यह अतिरिक्त कॉलम हो।
छद्म कोड इस प्रकार है -
df.map(count number of YES and append that at the end of the string")