2015-04-13 14 views
20
>>> 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 हैं और मैं एक को हटाना चाहता हूं। मैं कैसे कर सकता हूँ?pyspark डेटाफ्रेम में कॉलम को कैसे हटाएं

उत्तर

9

आप या तो स्पष्ट रूप से दिखाई देने वाले कॉलम रखने के लिए है, इसलिए की तरह चाहते हैं नाम दे सकते हैं:

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

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

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

मुझे लगता है कि मुझे जवाब मिल गया है। तारों की सूची न लेने के लिए स्ट्रिंग्स की एक सूची लेने की जरूरतों का चयन करें। तो ऐसा करें: 'रखना = [सी के लिए c.columns में सी] + [सी के लिए सी c.columns में सी! = 'आईडी']' 'डी = a.join (बी, a.id = = बी.आईडी, 'बाहरी')। चुनें (* रखें) ' – deusxmach1na

+0

ठीक है, यह मेरे उत्तर के समान ही काम करना चाहिए, क्योंकि मुझे पूरा यकीन है कि 'चयन' स्ट्रिंग या कॉलम स्वीकार करता है (https: // spark.apache.org/docs/latest/api/python/pyspark.sql.html#pyspark.sql.DataFrame)। बीटीडब्ल्यू, आपकी लाइन में 'रखें = ...' 'a' के लिए सूची समझ का उपयोग करने की कोई आवश्यकता नहीं है:' a.columns + [c c.c.cumnumns में c c c = = id '] को प्राप्त करना चाहिए सटीक वही बात, क्योंकि 'a.columns' पहले से तारों की' सूची 'है। – karlson

+0

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

0

हो सकता है कि विषय से दूर एक छोटा सा है, लेकिन यहां का उपयोग कर समाधान किया जाता है:

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

अंत में आप अपने में शामिल होने के परिणाम पर एक चयन करें: इस तरह उदाहरण के लिए (b से id स्तंभ को छोड़कर) स्काला। अपने oldDataFrame से कॉलम नामों के Array बनाएं और उन कॉलम को हटाएं जिन्हें आप ("colExclude") छोड़ना चाहते हैं। फिर Array[Column] से select पर जाएं और इसे अनपैक करें।

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

स्पार्क दस्तावेज पढ़ना मुझे एक आसान समाधान मिला।

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

आप इसे दो तरीके

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

Pyspark Documentation - Drop

+0

यह मेरे लिए खूबसूरती से काम करता है। धन्यवाद। – Bin

6

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

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

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

धन्यवाद, यह मेरे लिए एक और कॉलम के समान नाम वाले डुप्लिकेट कॉलम को हटाने के लिए बहुत अच्छा काम करता है, जहां मैं श्रेणी_num श्रेणी (len (df.columns) के लिए 'df.select ([df.columns [column_num] का उपयोग करता हूं) column_num! = 2]) ', जहां मैं जिस कॉलम को हटाना चाहता हूं वह इंडेक्स 2 है। –

संबंधित मुद्दे