Pyspark डेटाफ़्रेम में कॉलम कैसे हटाएं


83
>>> a
DataFrame[id: bigint, julian_date: string, user_id: bigint]
>>> b
DataFrame[id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]
>>> a.join(b, a.id==b.id, 'outer')
DataFrame[id: bigint, julian_date: string, user_id: bigint, id: bigint, quan_created_money: decimal(10,0), quan_created_cnt: bigint]

दो हैं id: bigintऔर मैं एक को हटाना चाहता हूं। मैं कैसे कर सकता हूँ?

जवाबों:


123

स्पार्क प्रलेखन पढ़ना मुझे एक आसान समाधान मिला।

चिंगारी के संस्करण 1.4 के बाद से एक फ़ंक्शन है drop(col)जो डेटाफ़्रेम पर pyspark में उपयोग किया जा सकता है।

आप इसे दो तरह से इस्तेमाल कर सकते हैं

  1. df.drop('age').collect()
  2. df.drop(df.age).collect()

Pyspark प्रलेखन - ड्रॉप


26
जब डेटा का आकार बड़ा होता है, इकट्ठा () ढेर स्थान त्रुटि का कारण हो सकता है। आप भी एक नया dataframe से अतिरिक्त क्षेत्र छोड़ने बना सकते हैंndf = df.drop('age')
mnis.p

1
यह वास्तव में पहला उत्तर होना चाहिए
vishalv2050

97

@ पैट्रिक के उत्तर में जोड़कर, आप कई कॉलमों को छोड़ने के लिए निम्न का उपयोग कर सकते हैं

columns_to_drop = ['id', 'id_copy']
df = df.drop(*columns_to_drop)

4
मुझे डेटाफ़्रेम पर ड्रॉप परिणामों को पुन: असाइन करना था: df = df.drop (*
कॉलम_to_drop

1
ध्यान दें कि यदि कॉलम मौजूद नहीं है तो आपको एक त्रुटि नहीं मिलेगी
Guido

मुझे TreeNodeException: Binding attribute, tree: _gen_alias_34#34एक कॉलम छोड़ने के बाद एक त्रुटि मिलती है , और उपयोग करते हैं.show()
frlzjosh

28

एक आसान तरीका है यह करने के लिए उपयोगकर्ता के लिए "है select" और एहसास है कि तुम सब की एक सूची प्राप्त कर सकते हैं columnsके लिए dataframe, dfके साथdf.columns

drop_list = ['a column', 'another column', ...]

df.select([column for column in df.columns if column not in drop_list])

1
धन्यवाद, यह मेरे लिए एक और स्तंभ के समान नाम के साथ डुप्लिकेट कॉलम को हटाने के लिए बहुत अच्छा काम करता है, जहां मैं उपयोग करता हूं, जहां मैं df.select([df.columns[column_num] for column_num in range(len(df.columns)) if column_num!=2])जिस कॉलम को निकालना चाहता हूं वह सूचकांक 2 है।
शेन हॉलोरन

12

आप या तो स्पष्ट रूप से उन कॉलम को नाम दे सकते हैं जिन्हें आप रखना चाहते हैं, जैसे:

keep = [a.id, a.julian_date, a.user_id, b.quan_created_money, b.quan_created_cnt]

या एक अधिक सामान्य दृष्टिकोण में आप सूची विवरण के माध्यम से विशिष्ट एक को छोड़कर सभी कॉलम शामिल करेंगे। इस तरह के उदाहरण के लिए ( idकॉलम को छोड़कर b):

keep = [a[c] for c in a.columns] + [b[c] for c in b.columns if c != 'id']

अंत में आप अपने सम्मिलित परिणाम पर चयन करते हैं:

d = a.join(b, a.id==b.id, 'outer').select(*keep)

मुझे लगता है कि मुझे जवाब मिल गया। स्तंभों की सूची नहीं तार की एक सूची लेने की आवश्यकता का चयन करें। तो ऐसा करें: keep = [c for c in a.columns] + [c for c in b.columns if c != 'id'] d = a.join(b, a.id==b.id, 'outer').select(*keep)
deusxmach1na

ठीक है, कि मेरे जवाब के रूप में बिल्कुल वैसा ही करना चाहिए, जैसा कि मुझे पूरा यकीन है कि selectया तो तार या स्तंभ ( स्पार्क .apache.org/docs/latest/api/python/ ) स्वीकार करता है । Btw, आपकी लाइन में निम्न के keep = ...लिए सूची बोध का उपयोग करने की कोई आवश्यकता नहीं है a: a.columns + [c for c in b.columns if c != 'id']ठीक उसी चीज़ को प्राप्त करना चाहिए, जैसा a.columnsकि पहले से ही listस्ट्रिंग्स का है।
कार्लसन

@ deusxmach1na दरअसल स्ट्रिंग्स पर आधारित कॉलम चयन ओपी के लिए काम नहीं कर सकता है, क्योंकि यह idकॉलम की अस्पष्टता को हल नहीं करेगा । उस स्थिति में आपको Columnउदाहरणों का उपयोग करना होगा select
कार्लसन

सभी अच्छे अंक। मैंने स्पार्क 1.3 में आपके समाधान की कोशिश की और त्रुटियों को प्राप्त किया, इसलिए मैंने जो पोस्ट किया वह वास्तव में मेरे लिए काम किया। और आईडी की अस्पष्टता को हल करने के लिए मैंने अपनी आईडी कॉलम को नाम जुड़ने से पहले बदल दिया और फिर इसे कॉन लिस्ट का उपयोग करके जॉइन के बाद हटा दिया। HTH किसी और कि मैं था की तरह अटक गया था।
deusxmach1na

12

आप दो तरह से उपयोग कर सकते हैं:

1: आप बस आवश्यक कॉलम रखते हैं:

drop_column_list = ["drop_column"]
df = df.select([column for column in df.columns if column not in drop_column_list])  

2: यह अधिक सुरुचिपूर्ण तरीका है।

df = df.drop("col_name")

आपको संग्रह () संस्करण से बचना चाहिए, क्योंकि यह मास्टर को संपूर्ण डेटासेट में भेज देगा, यह एक बड़ा कंप्यूटिंग प्रयास करेगा!


3

हो सकता है कि विषय से थोड़ा हटकर हो, लेकिन यहां स्कैला का उपयोग करके समाधान दिया गया है। Arrayअपने से कॉलम के नाम बनाएं oldDataFrameऔर उन कॉलम को हटाएं जिन्हें आप ड्रॉप करना चाहते हैं ("colExclude")। तब से पारित Array[Column]करने के लिए selectऔर खोल दे।

val columnsToKeep: Array[Column] = oldDataFrame.columns.diff(Array("colExclude"))
                                               .map(x => oldDataFrame.col(x))
val newDataFrame: DataFrame = oldDataFrame.select(columnsToKeep: _*)

-1

2 आंकड़ों पर विचार करें:

>>> aDF.show()
+---+----+
| id|datA|
+---+----+
|  1|  a1|
|  2|  a2|
|  3|  a3|
+---+----+

तथा

>>> bDF.show()
+---+----+
| id|datB|
+---+----+
|  2|  b2|
|  3|  b3|
|  4|  b4|
+---+----+

आप जो खोज रहे हैं, उसे पूरा करने के लिए 2 तरीके हैं:

1. विभिन्न जुड़ने की स्थिति। इसके बजाय aDF.id == bDF.id कहने के बजाय

aDF.join(bDF, aDF.id == bDF.id, "outer")

इसे लिखें:

aDF.join(bDF, "id", "outer").show()
+---+----+----+
| id|datA|datB|
+---+----+----+
|  1|  a1|null|
|  3|  a3|  b3|
|  2|  a2|  b2|
|  4|null|  b4|
+---+----+----+

यह स्वचालित रूप से छोड़ने की प्रक्रिया से छुटकारा पा लेगा।

2. अलियासिंग का उपयोग करें: इसमें आपको बी स्पेसिफिक आईडी से संबंधित डेटा खो जाएगा।

>>> from pyspark.sql.functions import col
>>> aDF.alias("a").join(bDF.alias("b"), aDF.id == bDF.id, "outer").drop(col("b.id")).show()

+----+----+----+
|  id|datA|datB|
+----+----+----+
|   1|  a1|null|
|   3|  a3|  b3|
|   2|  a2|  b2|
|null|null|  b4|
+----+----+----+

-2

आप इस तरह से कॉलम को हटा सकते हैं:

df.drop("column Name).columns

आपके मामले में :

df.drop("id").columns

यदि आप एक से अधिक कॉलम छोड़ना चाहते हैं, तो आप कर सकते हैं:

dfWithLongColName.drop("ORIGIN_COUNTRY_NAME", "DEST_COUNTRY_NAME")

1
स्पार्क 2.4 (और सबसे कम संस्करण) एक से अधिक कॉलम नाम को स्वीकार नहीं करता है।
22

क्या सूचकांक द्वारा कॉलम गिराना संभव है?
होरबाजे

@seufagner यह सिर्फ एक सूची के रूप में इसे पास करता है
Dee
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.