2016-08-20 19 views
17

मैं पांडा के लिए नया हूं और यह पता लगाने की कोशिश कर रहा हूं कि पांडों को एक साथ कई स्तंभ कैसे जोड़ना है। यहां कोई मदद की सराहना की जाती है। आदर्श रूप में मैं concat के उपयोग के साथ के बजाय एक कदम कई बार-बार चरणों में यह करने के लिए ...एक साथ पांडा को कई कॉलम जोड़कर

import pandas as pd 

df = {'col_1': [0, 1, 2, 3], 
     'col_2': [4, 5, 6, 7]} 
df = pd.DataFrame(df) 

df[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs',3] #thought this would work here... 

उत्तर

21

मुझे आपके वाक्यविन्यास को भी काम करने की उम्मीद होगी। समस्या उत्पन्न होती है क्योंकि जब आप कॉलम-सूची सिंटैक्स (df[[new1, new2]] = ...) के साथ नए कॉलम बनाते हैं, तो पांडा की आवश्यकता होती है कि दायां हाथ एक डेटाफ्रेम हो (ध्यान दें कि यह वास्तव में कोई फर्क नहीं पड़ता कि डेटाफ्रेम के कॉलम के समान नाम हैं कॉलम जो आप बना रहे हैं)।

आपका वाक्य रचना मौजूदा स्तंभों को अदिश मान निर्दिष्ट के लिए ठीक काम करता है, और पांडा भी एकल-स्तंभ वाक्य रचना (df[new1] = ...) का उपयोग कर एक नया स्तंभ को अदिश मान निर्दिष्ट करने के लिए खुश है। तो समाधान या तो इसे कई सिंगल-कॉलम असाइनमेंट में परिवर्तित करने के लिए है, या दाईं ओर एक उपयुक्त डेटाफ्रेम बनाएं।

यहाँ कई दृष्टिकोण हैं कि होगा काम:

import pandas as pd 
import numpy as np 

df = pd.DataFrame({ 
    'col_1': [0, 1, 2, 3], 
    'col_2': [4, 5, 6, 7] 
}) 

फिर से एक निम्नलिखित:

(1) तकनीकी तौर पर यह तीन चरणों है, लेकिन यह एक कदम की तरह दिखता है:

df['column_new_1'], df['column_new_2'], df['column_new_3'] = [np.nan, 'dogs', 3] 

(2) DataFrame आसानी से सूचकांक से मेल खाने के लिए एक पंक्ति का विस्तार करता है, ताकि आप यह कर सकें:

df[['column_new_1', 'column_new_2', 'column_new_3']] = pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index) 

(3) यह अच्छी तरह से काम करेगा अगर आप नए स्तंभ के साथ एक अस्थायी डेटा फ्रेम बनाने के लिए, फिर बाद में मूल डेटा फ्रेम के साथ गठबंधन:

df = pd.concat(
    [ 
     df, 
     pd.DataFrame(
      [[np.nan, 'dogs', 3]], 
      index=df.index, 
      columns=['column_new_1', 'column_new_2', 'column_new_3'] 
     ) 
    ], axis=1 
) 

(4) पिछले की तरह, लेकिन concat के बजाय join का उपयोग कर (कम कुशल हो सकता है):

df = df.join(pd.DataFrame(
    [[np.nan, 'dogs', 3]], 
    index=df.index, 
    columns=['column_new_1', 'column_new_2', 'column_new_3'] 
)) 

(5) यह एक अधिक "प्राकृतिक" की तुलना में पिछले दो नए डेटा फ्रेम बनाने के लिए तरीका है, लेकिन नए स्तंभ अल्फा हल हो जाएगा betically (कम से कम before Python 3.6 or 3.7):

df = df.join(pd.DataFrame(
    { 
     'column_new_1': np.nan, 
     'column_new_2': 'dogs', 
     'column_new_3': 3 
    }, index=df.index 
)) 

(6) मैं @ पर इस प्रकार की तरह शून्य के एक बहुत का जवाब है, लेकिन कम से कम अजगर के प्रारंभिक संस्करणों के साथ पिछले एक की तरह, नए कॉलम हमेशा वर्णानुक्रम हल हो जाएगा :

df = df.assign(column_new_1=np.nan, column_new_2='dogs', column_new_3=3) 

(7) यह दिलचस्प है (पर https://stackoverflow.com/a/44951376/3830997 आधारित), लेकिन मैं नहीं जानता कि जब यह मुसीबत के लायक हो जाएगा:

new_cols = ['column_new_1', 'column_new_2', 'column_new_3'] 
new_vals = [np.nan, 'dogs', 3] 
df = df.reindex(columns=df.columns.tolist() + new_cols) # add empty cols 
df[new_cols] = new_vals # multi-column assignment works for existing cols 

(8) में अंत में यह मुश्किल है इस को हरा:

df['column_new_1'] = np.nan 
df['column_new_2'] = 'dogs' 
df['column_new_3'] = 3 

नोट: इन विकल्पों में से कई पहले से ही अन्य उत्तर में शामिल किया गया है: Add multiple columns to DataFrame and set them equal to an existing column, Is it possible to add several columns at once to a pandas DataFrame?, Pandas: Add multiple empty columns to DataFrame

2

चाहते हैं:

In [128]: df 
Out[128]: 
    col_1 col_2 
0  0  4 
1  1  5 
2  2  6 
3  3  7 

In [129]: pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])]) 
Out[129]: 
    col_1 col_2 column_new_1 column_new_2 column_new_3 
0 0.0 4.0   NaN   NaN   NaN 
1 1.0 5.0   NaN   NaN   NaN 
2 2.0 6.0   NaN   NaN   NaN 
3 3.0 7.0   NaN   NaN   NaN 

बहुत क्या आप [np.nan, 'dogs',3] साथ करना चाहता था के बारे में सुनिश्चित नहीं है। शायद उन्हें डिफ़ॉल्ट मान के रूप में सेट करें?

In [142]: df1 = pd.concat([df, pd.DataFrame(columns = [ 'column_new_1', 'column_new_2','column_new_3'])]) 
In [143]: df1[[ 'column_new_1', 'column_new_2','column_new_3']] = [np.nan, 'dogs', 3] 

In [144]: df1 
Out[144]: 
    col_1 col_2 column_new_1 column_new_2 column_new_3 
0 0.0 4.0   NaN   dogs    3 
1 1.0 5.0   NaN   dogs    3 
2 2.0 6.0   NaN   dogs    3 
3 3.0 7.0   NaN   dogs    3 
+0

यदि एक चरण में अपना दूसरा भाग करने का कोई तरीका था - हाँ उदाहरण के रूप में कॉलम में स्थिर मान। – runningbirds

1

pd.concat

pd.concat(
    [ 
     df, 
     pd.DataFrame(
      [[np.nan, 'dogs', 3] for _ in range(df.shape[0])], 
      df.index, ['column_new_1', 'column_new_2','column_new_3'] 
     ) 
    ], axis=1) 
सूची समझ का उपयोग करते हैं, pd.DataFrame और

enter image description here

0

बस यह इंगित करना चाहते हैं कि @Matthias Fripp के जवाब में OPTION2

(2) मैं जरूरी DataFrame इस तरह से काम करने की उम्मीद नहीं होगा, लेकिन यह करता है

df [[ 'column_new_1', 'column_new_2', 'column_new_3']] = पीडी। डेटाफ्रेम ([[एनपीएनएन, 'कुत्तों', 3]], सूचकांक = डीएफ।सूचकांक)

पहले से ही पांडा 'स्वयं के प्रलेखन http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics

में प्रलेखित है आप उस क्रम में स्तंभों का चयन करने के लिए [] करने के लिए कॉलम की एक सूची पारित कर सकते हैं। यदि डेटाफ्रेम में कोई स्तंभ शामिल नहीं है, तो एक अपवाद उठाया जाएगा। इस तरह से कई कॉलम भी सेट किए जा सकते हैं। कॉलम के सबसेट में आपको ट्रांसफॉर्म (इन-प्लेस) लागू करने के लिए यह उपयोगी हो सकता है।

+0

मुझे लगता है कि यह मल्टी-कॉलम असाइनमेंट के लिए बहुत मानक है। जिस भाग ने मुझे आश्चर्यचकित किया वह था कि 'पीडी। डेटाफ्रेम ([[एनपीएनएनएन,' कुत्तों ', 3]], इंडेक्स = डीएफ.इंडेक्स)' एक पंक्ति को दोहराता है जो पूरे डेटाफ्रेम को उसी लंबाई के रूप में बनाने के लिए दिया जाता है सूचकांक। –

4

आप स्तंभ नाम और मूल्यों की एक dict साथ assign इस्तेमाल कर सकते हैं।

In [1069]: df.assign(**{'col_new_1': np.nan, 'col2_new_2': 'dogs', 'col3_new_3': 3}) 
Out[1069]: 
    col_1 col_2 col2_new_2 col3_new_3 col_new_1 
0  0  4  dogs   3  NaN 
1  1  5  dogs   3  NaN 
2  2  6  dogs   3  NaN 
3  3  7  dogs   3  NaN 
संबंधित मुद्दे