पांडा डेटाफ़्रेम [डुप्लिकेट] के लिए निरंतर मान के साथ कॉलम जोड़ें


102

एक DataFrame दिया:

np.random.seed(0)
df = pd.DataFrame(np.random.randn(3, 3), columns=list('ABC'), index=[1, 2, 3])
df

          A         B         C
1  1.764052  0.400157  0.978738
2  2.240893  1.867558 -0.977278
3  0.950088 -0.151357 -0.103219

0 जैसे स्थिर मान वाले नए कॉलम को जोड़ने का सबसे सरल तरीका क्या है?

          A         B         C  new
1  1.764052  0.400157  0.978738    0
2  2.240893  1.867558 -0.977278    0
3  0.950088 -0.151357 -0.103219    0

यह मेरा समाधान है, लेकिन मुझे नहीं पता कि यह NaN को 'नए' कॉलम में क्यों डालता है?

df['new'] = pd.Series([0 for x in range(len(df.index))])

          A         B         C  new
1  1.764052  0.400157  0.978738  0.0
2  2.240893  1.867558 -0.977278  0.0
3  0.950088 -0.151357 -0.103219  NaN

9
यदि आप एक इंडेक्स का उपयोग करते हैं तो ठीक है। df['new'] = pd.Series([0 for x in range(len(df.index))], index=df.index)
zach

5
भी, एक सूची समझ पूरी तरह से यहाँ अनावश्यक है। बस करते हैं[0] * len(df.index)
Acushner

@ जॉरिस, मेरा मतलब था कि df ['नई'] = 0 पूरे कॉलम को शून्य असाइन करने का उचित कारण दिखाता है, लेकिन यह नहीं समझाता है कि मेरा पहला प्रयास NaN सम्मिलित क्यों करता है। मुझे स्वीकार किए गए उत्तर में फिलिप क्लाउड द्वारा इसका जवाब दिया गया था।
यमू ०

7
बस करोdf['new'] = 0
flow2k

जवाबों:


21

कारण यह NaNएक स्तंभ में डालता है क्योंकि df.indexऔर Indexआपके दाहिने हाथ की वस्तु अलग हैं। @ ज़ैच शून्य का एक नया कॉलम असाइन करने का उचित तरीका दिखाता है। सामान्य तौर पर, pandasजितना संभव हो उतना सूचकांकों के संरेखण को करने की कोशिश करता है। एक नकारात्मक पक्ष यह है कि जब सूचकांकों को संरेखित नहीं किया जाता है तो आप NaNकहीं भी संरेखित नहीं होते हैं । आंशिक रूप से, पूरी तरह से, और संरेखित-सभी संरेखित ऑब्जेक्ट्स के साथ संरेखण कार्यों के लिए कुछ अंतर्ज्ञान प्राप्त करने के लिए reindexऔर alignतरीकों के साथ चारों ओर खेलें । उदाहरण के लिए यहां DataFrame.align()आंशिक रूप से संरेखित सूचकांकों के साथ कैसे काम किया जाता है:

In [7]: from pandas import DataFrame

In [8]: from numpy.random import randint

In [9]: df = DataFrame({'a': randint(3, size=10)})

In [10]:

In [10]: df
Out[10]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [11]: s = df.a[:5]

In [12]: dfa, sa = df.align(s, axis=0)

In [13]: dfa
Out[13]:
   a
0  0
1  2
2  0
3  1
4  0
5  0
6  0
7  0
8  0
9  0

In [14]: sa
Out[14]:
0     0
1     2
2     0
3     1
4     0
5   NaN
6   NaN
7   NaN
8   NaN
9   NaN
Name: a, dtype: float64

9
मैं downvote लेकिन नहीं था अपने कोड टिप्पणी का अभाव है, यह बनाता है कठिन है कि आप में टुकड़ा हासिल करने की कोशिश में आगे बढ़ने के लिए
निवारण

8
यह वास्तव में सवाल का जवाब नहीं देता है। ओपी एक निरंतर मूल्य वाले नए कॉलम को जोड़ने के बारे में पूछ रहा है।
cs95

मैं सहमत नहीं हूँ कि यहाँ सिर्फ एक सवाल है। "मैं किसी कॉलम में निरंतर मान कैसे प्रदान करूं?" साथ ही "ऐसा करने का मेरा प्रयास एक्स तरीके से काम नहीं करता है, यह अप्रत्याशित रूप से क्यों व्यवहार कर रहा है?" मेरा मानना ​​है कि मैंने दोनों बिंदुओं को संबोधित किया है, पहले किसी अन्य उत्तर का संदर्भ देकर। कृपया मेरे उत्तर में सभी पाठ पढ़ें ।
फिलिप क्लाउड

मुझे लगता है कि समस्या आपके उत्तर के बजाय प्रश्न के साथ है। इस पोस्ट में दो अलग-अलग प्रश्न हैं और परिणामस्वरूप प्रश्न का उत्तर देने के लिए दो अलग-अलग उत्तरों की आवश्यकता होती है। मेरा मानना ​​है कि इसे बहुत व्यापक होने के रूप में चिह्नित किया जाना चाहिए था और पोस्टर को दो अलग-अलग प्रश्न पूछने चाहिए थे।
केविन

82

सुपर सरल इन-प्लेस असाइनमेंट: df['new'] = 0

इन-प्लेस संशोधन के लिए, प्रत्यक्ष असाइनमेंट करें। यह कार्य प्रत्येक पंक्ति के लिए पांडा द्वारा प्रसारित किया जाता है।

df = pd.DataFrame('x', index=range(4), columns=list('ABC'))
df

   A  B  C
0  x  x  x
1  x  x  x
2  x  x  x
3  x  x  x

df['new'] = 'y'
# Same as,
# df.loc[:, 'new'] = 'y'
df

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

ऑब्जेक्ट कॉलम के लिए ध्यान दें

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

  • ऐसा न करने पर विचार करें। objectकॉलम प्रदर्शन के मामले में बुरी खबर हैं। रीथिंक करें कि आपका डेटा कैसे संरचित है।
  • अपने डेटा को एक विरल डेटा संरचना में संग्रहीत करने पर विचार करें। अधिक जानकारी: विरल डेटा संरचनाएँ
  • यदि आपको सूचियों का एक स्तंभ संग्रहीत करना होगा, तो सुनिश्चित करें कि एक ही संदर्भ को कई बार कॉपी न करें।

    # Wrong
    df['new'] = [[]] * len(df)
    # Right
    df['new'] = [[] for _ in range(len(df))]
    

प्रतिलिपि बनाना: df.assign(new=0)

यदि आपको इसके बजाय प्रतिलिपि की आवश्यकता है, तो उपयोग करें DataFrame.assign:

df.assign(new='y')

   A  B  C new
0  x  x  x   y
1  x  x  x   y
2  x  x  x   y
3  x  x  x   y

और, यदि आपको एक ही मान के साथ कई ऐसे कॉलम निर्दिष्ट करने की आवश्यकता है, तो यह उतना ही सरल है,

c = ['new1', 'new2', ...]
df.assign(**dict.fromkeys(c, 'y'))

   A  B  C new1 new2
0  x  x  x    y    y
1  x  x  x    y    y
2  x  x  x    y    y
3  x  x  x    y    y

एकाधिक कॉलम असाइनमेंट

अंत में, यदि आपको विभिन्न मानों के साथ कई कॉलम असाइन करने की आवश्यकता है, तो आप assignएक शब्दकोश के साथ उपयोग कर सकते हैं ।

c = {'new1': 'w', 'new2': 'y', 'new3': 'z'}
df.assign(**c)

   A  B  C new1 new2 new3
0  x  x  x    w    y    z
1  x  x  x    w    y    z
2  x  x  x    w    y    z
3  x  x  x    w    y    z

17

आधुनिक पांडा के साथ आप बस कर सकते हैं:

df['new'] = 0

1
क्या आप बता सकते हैं कि कौन से विशिष्ट उत्तर पुराने हैं? आइए उनके नीचे एक टिप्पणी छोड़ दें ताकि लेखकों को सुधारने का मौका मिले।
cs95

1
इस उत्तर और cs95 (AKA, me) उत्तर के बीच एकमात्र अंतर कॉलम नाम और मूल्य है। सब टुकड़े हैं।
cs95

1
यह इतना अधिक नहीं है कि वे पुराने हैं, लेकिन यह उत्तर दूसरों की तुलना में कम क्रियात्मक है और पढ़ने में आसान है।
जॉय

1
@ जॉय उस तर्क के साथ बहस नहीं कर सकते, मुझे लगता है कि यह जवाब उन लोगों के लिए अधिक अनुकूल है जो लाइब्रेरी के बारे में अधिक समझने और जानने के बजाय केवल कुछ भी कॉपी पेस्ट करने के लिए काम कर रहे हैं। टच।
cs95

1
@ सीएस 95 आपके जवाब से लोगों को और अधिक जानने में मदद करता है। इसके अलावा df ['नई'] = 0 शीर्षक में हाइलाइट पठनीयता के लिए अच्छा है। मैंने वह भी उकेरा है। Df.apply (लैम्ब्डा x: 0, अक्ष = 1) की तुलना में कम क्रिया
जॉय

7

यहाँ लैम्बदास का उपयोग करने वाला एक और लाइनर है (निरंतर मान = 10 के साथ कॉलम बनाएं)

df['newCol'] = df.apply(lambda x: 10, axis=1)

इससे पहले

df
    A           B           C
1   1.764052    0.400157    0.978738
2   2.240893    1.867558    -0.977278
3   0.950088    -0.151357   -0.103219

उपरांत

df
        A           B           C           newCol
    1   1.764052    0.400157    0.978738    10
    2   2.240893    1.867558    -0.977278   10
    3   0.950088    -0.151357   -0.103219   10

5
df['newCol'] = 10एक लाइनर भी है (और तेज है)। यहां पर आवेदन करने से क्या फायदा है?
सीएस 9595

2
यहां आपके साथ प्रतिस्पर्धा करने की कोशिश नहीं की जा रही है - बस एक वैकल्पिक दृष्टिकोण दिखा रहा है।
ग्रांट शैनन

@ सीएस 95 यह मददगार है। मैं एक नया कॉलम बनाना चाहता था जहाँ प्रत्येक मान एक अलग खाली सूची थी। केवल यह विधि काम करती है।
यतीर्थ अग्रवाल

@YatharthAgarwal मैं आपको वह देता हूं, लेकिन यह भी समझ में आता है कि पंडों को सूचियों के स्तंभों के साथ अच्छी तरह से काम करने के लिए डिज़ाइन नहीं किया गया है।
cs95

1
@YatharthAgarwal यदि आपको खाली सूचियों को असाइन करने की आवश्यकता है, तो यह अभी भी एक सबपर समाधान है क्योंकि यह लागू होता है। कोशिश करेंdf['new'] = [[] for _ in range(len(df))]
cs95
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.