एक असाइनमेंट में पंडों डेटाफ्रेम में कई कॉलम कैसे जोड़ें?


122

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

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...

आपको यह बताने की आवश्यकता है कि आपको क्या त्रुटि मिली। जब मैं पांडा 1.0 पर इस कोशिश मैंKeyError: "None of [Index(['column_new_1', 'column_new_2', 'column_new_3'], dtype='object')] are in the [columns]"
एसएमसीआई

जवाबों:


185

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

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

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

import pandas as pd
import numpy as np

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

फिर निम्न में से एक:

1) तीन कार्य में एक, सूची unpacking का उपयोग:

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) पिछले के समान, लेकिन joinइसके बजाय का उपयोग करना concat(कम कुशल हो सकता है):

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

5) पिछले दो की तुलना में नए डेटा फ्रेम बनाने के लिए एक तानाशाही का उपयोग करना अधिक "प्राकृतिक" तरीका है, लेकिन नए कॉलमों को वर्णानुक्रम में (कम से कम पायथन 3.6 या 3.7 से पहले ) हल किया जाएगा :

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

6) .assign()कई कॉलम तर्क के साथ उपयोग करें ।

मुझे यह वेरिएंट @ ज़ीरो के उत्तर पर बहुत पसंद है, लेकिन पिछले वाले की तरह, नए कॉलम हमेशा वर्णानुक्रम में छाँटे जाएंगे, कम से कम पायथन के शुरुआती संस्करणों के साथ:

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

नोट: इनमें से कई विकल्प पहले से ही अन्य उत्तरों में शामिल किए गए हैं: DataFrame में कई कॉलम जोड़ें और उन्हें मौजूदा कॉलम के बराबर सेट करें , क्या एक पांडा डेटाफ़्रेम में एक बार में कई कॉलम जोड़ना संभव है? , पंडों के लिए कई खाली कॉलम जोड़ें DataFrame


# 7 से संपर्क नहीं करेंगे ( .reindex) डेटाफ्रेम के सूचकांक में परिवर्तन करें? जब तक यह स्पष्ट लक्ष्य न हो, तब तक कॉलम जोड़ते समय कोई व्यक्ति अनावश्यक रूप से सूचकांक को बदलना क्यों चाहेगा ...
एक्युमेनस

1
.reindex()का उपयोग columnsतर्क के साथ किया जाता है, इसलिए यह केवल कॉलम "इंडेक्स" (नाम) को बदलता है। यह पंक्ति अनुक्रमणिका में परिवर्तन नहीं करता है।
Matthias Fripp

कुछ दृष्टिकोणों के लिए, आप उपयोग कर सकते हैं OrderedDict: उदाहरण के लिए,df.join(pd.DataFrame( OrderedDict([('column_new_2', 'dogs'),('column_new_1', np.nan),('column_new_3', 3)]), index=df.index ))
हैशमुक

@ शशमुक जो पायथन के शुरुआती संस्करणों के लिए समझ में आता है। यह विशेष रूप से पंडों में कई चीजों के लिए शब्दकोशों का उपयोग करने वाले लोगों से अपील कर सकता है, उदाहरण के लिए, df = pd.DataFrame({'before': [1, 2, 3], 'after': [4, 5, 6]})बनामdf = pd.DataFrame(OrderedDict([('before', [1, 2, 3]), ('after', [4, 5, 6])])
मैथियास फ्रेंप

2
यदि आप विकल्प का उपयोग कर रहे हैं join, तो सुनिश्चित करें कि आपके पास आपके अनुक्रमणिका में डुप्लिकेट नहीं है (या reset_indexपहले का उपयोग करें )। आपको डिबगिंग के कुछ घंटे बचा सकते हैं।
गुइडो

40

आप 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

क्या ऐसा करने का एक तरीका है जो कॉलम के एक विशिष्ट क्रम को बनाए रखता है?
user48956

1
आप कई बार df.assign(**{'col_new_1': np.nan}).assign(**{'col2_new_2': 'dogs'}).assign(**{'col3_new_3': 3})
असाइनमेंट

9

समतल के उपयोग के साथ :

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

यदि एक चरण में आपका दूसरा भाग करने का एक तरीका है - उदाहरण के रूप में स्तंभों में निरंतर मान।
रनबर्ड्स

3

सूची समझ का उपयोग, pd.DataFrameऔर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)

यहां छवि विवरण दर्ज करें


3

यदि बहुत सारे लापता कॉलम (a, b, c, ....) को उसी मान से जोड़ा जाए, तो यहाँ 0, मैंने यह किया है:

    new_cols = ["a", "b", "c" ] 
    df[new_cols] = pd.DataFrame([[0] * len(new_cols)], index=df.index)

यह स्वीकृत उत्तर के दूसरे संस्करण पर आधारित है।


0

बस @Matthias Fripp के जवाब में उस विकल्प 2 को इंगित करना चाहते हैं

(2) मैं जरूरी नहीं चाहता कि DataFrame इस तरह से काम करे, लेकिन यह करता है

df [[f column_new_1 ’, n column_new_2’, ew column_new_3 ’]] = pd.DataFrame ([[np.nan,’ dogs ’, 3]], सूचकांक = ff.index)

पांडा के स्वयं के दस्तावेज http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics में पहले से ही प्रलेखित है।

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


मुझे लगता है कि यह बहु-स्तंभ असाइनमेंट के लिए बहुत मानक है। जिस भाग ने मुझे आश्चर्यचकित किया, वह यह था कि pd.DataFrame([[np.nan, 'dogs', 3]], index=df.index)एक पूरी पंक्ति को अनुक्रमणिका की समान लंबाई बनाने के लिए दी गई एक पंक्ति की प्रतिकृति है।
मथायस फ्रायप

0

यदि आप केवल खाली नए कॉलम जोड़ना चाहते हैं, तो reindex काम करेगा

df
   col_1  col_2
0      0      4
1      1      5
2      2      6
3      3      7

df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
   col_1  col_2  column_new_1  column_new_2  column_new_3
0      0      4           NaN           NaN           NaN
1      1      5           NaN           NaN           NaN
2      2      6           NaN           NaN           NaN
3      3      7           NaN           NaN           NaN

पूर्ण कोड उदाहरण

import numpy as np
import pandas as pd

df = {'col_1': [0, 1, 2, 3],
        'col_2': [4, 5, 6, 7]}
df = pd.DataFrame(df)
print('df',df, sep='\n')
print()
df=df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)
print('''df.reindex(list(df)+['column_new_1', 'column_new_2','column_new_3'], axis=1)''',df, sep='\n')

अन्यथा असाइन किए गए शून्य जवाब के लिए जाएं


0

मैं "इंडेक्स" इत्यादि का उपयोग करने में सहज नहीं हूं ... और नीचे भी आ सकता है

df.columns
Index(['A123', 'B123'], dtype='object')

df=pd.concat([df,pd.DataFrame(columns=list('CDE'))])

df.rename(columns={
    'C':'C123',
    'D':'D123',
    'E':'E123'
},inplace=True)


df.columns
Index(['A123', 'B123', 'C123', 'D123', 'E123'], dtype='object')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.