पायथन पांडा में मौजूदा DataFrame में नया कॉलम जोड़ना


978

निम्नलिखित स्तंभों और पंक्तियों के साथ निम्नलिखित अनुक्रमित डेटाफ़्रेम मेरे पास हैं- निरंतर संख्याएँ:

          a         b         c         d
2  0.671399  0.101208 -0.181532  0.241273
3  0.446172 -0.243316  0.051767  1.577318
5  0.614758  0.075793 -0.451460 -0.012493

मैं 'e'मौजूदा डेटा फ़्रेम में एक नया कॉलम जोड़ना चाहूंगा और डेटा फ़्रेम में कुछ भी बदलना नहीं चाहता (यानी, नए कॉलम में हमेशा डेटाफ़्रेम की लंबाई समान होती है)।

0   -0.335485
1   -1.166658
2   -0.385571
dtype: float64

मैं eउपरोक्त उदाहरण में कॉलम कैसे जोड़ सकता हूं ?

जवाबों:


1043

श्रृंखला बनाने के लिए मूल df1 अनुक्रमित का उपयोग करें:

df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)

2015 संपादित करें
कुछ ने SettingWithCopyWarningइस कोड के साथ रिपोर्ट करने की सूचना दी ।
हालाँकि, कोड अभी भी वर्तमान पांडा संस्करण 0.16.1 के साथ पूरी तरह से चलता है।

>>> sLength = len(df1['a'])
>>> df1
          a         b         c         d
6 -0.269221 -0.026476  0.997517  1.294385
8  0.917438  0.847941  0.034235 -0.448948

>>> df1['e'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e
6 -0.269221 -0.026476  0.997517  1.294385  1.757167
8  0.917438  0.847941  0.034235 -0.448948  2.228131

>>> p.version.short_version
'0.16.1'

SettingWithCopyWarningउद्देश्य Dataframe की एक प्रति पर एक संभवतः अवैध काम के बारे में सूचित करने के लिए। यह जरूरी नहीं है कि आपने इसे गलत कहा (यह झूठी सकारात्मकता को ट्रिगर कर सकता है) लेकिन 0.13.0 से यह आपको बताएंगे कि एक ही उद्देश्य के लिए अधिक पर्याप्त तरीके हैं। फिर, यदि आपको चेतावनी मिलती है, तो बस उसकी सलाह का पालन करें: .loc का उपयोग करने का प्रयास करें [row_index, col_indexerer = = बजाय

>>> df1.loc[:,'f'] = pd.Series(np.random.randn(sLength), index=df1.index)
>>> df1
          a         b         c         d         e         f
6 -0.269221 -0.026476  0.997517  1.294385  1.757167 -0.050927
8  0.917438  0.847941  0.034235 -0.448948  2.228131  0.006109
>>> 

वास्तव में, यह वर्तमान में पंडों के डॉक्स में वर्णित अधिक कुशल विधि है


2017 को संपादित करें

जैसा कि टिप्पणियों में और @Alexander द्वारा इंगित किया गया है, वर्तमान में किसी DataFrame के नए कॉलम के रूप में श्रृंखला के मूल्यों को जोड़ने के लिए सबसे अच्छा तरीका है assign:

df1 = df1.assign(e=pd.Series(np.random.randn(sLength)).values)

24
आप की जरूरत है अगर आगे जोड़ते df1.insert (0, 'ए', श्रृंखला (np.random.randn (sLength), सूचकांक = df1.index)): स्तंभ उपयोग DataFrame.insert
lowtech

29
पंडों के संस्करण 0.12 से, मेरा मानना ​​है कि यह वाक्यविन्यास इष्टतम नहीं है, और चेतावनी देता है:SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_index,col_indexer] = value instead
ज़ुर्बर्ब

6
SettingWithCopy चेतावनी के रूप में किसी भी तरह .loc अधिक चेतावनी में परिणामों के बाद: ... self.obj [item_labels [इंडेक्सर [info_axis]]] = मूल्य
seongjoo

12
@toto_tico आप एक kwargsशब्दकोश को अनपैक कर सकते हैं , जैसे:df1 = df1.assign(**{'e': p.Series(np.random.randn(sLength)).values})
टीसी प्रॉक्टर

23
"वर्तमान में" या संदर्भित वर्षों के बजाय, कृपया पंडों के संस्करण संख्याओं का संदर्भ लें, उदाहरण के लिए "0.14-0.16 do X के बीच, 0.17+ में Y करें ..."
smci

229

यह एक नया कॉलम जोड़ने का सरल तरीका है: df['e'] = e


153
वोटों की अधिक संख्या के बावजूद: यह जवाब गलत है । ध्यान दें कि ओपी में गैर सतत अनुक्रमित के साथ एक डेटाफ्रेम है और e( Series(np.random.randn(sLength))) एक श्रृंखला 0-एन अनुक्रमित उत्पन्न करता है। यदि आप इसे df1 को असाइन करते हैं तो आपको कुछ NaN सेल मिलते हैं।
जौक्विन

32
@Joaquin जो कहते हैं वह सच है, लेकिन जब तक आप इसे ध्यान में रखते हैं, यह एक बहुत ही उपयोगी शॉर्टकट है।
वेदतोपकर

2
@ एरिक लेसचिंस्की: यकीन नहीं है कि आप इस सवाल के लिए कैसे संपादित करेंगे। my_dataframe = pd.DataFrame(columns=('foo', 'bar'))। अपना संपादन फिर से करना
काठिरमणि सुकुमार

1
यह मदद नहीं करता है, क्योंकि यदि आपके पास कई पंक्तियाँ हैं, और आप असाइनमेंट का उपयोग करते हैं, तो यह नए कॉलम की सभी पंक्तियों को उस मान के साथ असाइन करता है (आपके मामले में ई) जो आमतौर पर अवांछनीय है।
पाणिज

156

मैं मौजूदा डेटा फ़्रेम में एक नया कॉलम, 'e' जोड़ना चाहूंगा और डेटा फ़्रेम में कुछ भी नहीं बदलूंगा। (श्रृंखला को हमेशा डेटाफ़्रेम के समान लंबाई मिली।)

मुझे लगता है कि सूचकांक मूल्यों में eमैच उन में df1

नाम का एक नया कॉलम आरंभ करने का सबसे आसान तरीका है e, और इसे अपनी श्रृंखला से मान निर्दिष्ट करें e:

df['e'] = e.values

असाइन करें (पंडों 0.16.0+)

पंडों 0.16.0 के रूप में, आप भी उपयोग कर सकते हैं assign, जो एक DataFrame को नए कॉलम प्रदान करता है और नए लोगों के अलावा सभी मूल स्तंभों के साथ एक नई ऑब्जेक्ट (एक प्रतिलिपि) लौटाता है।

df1 = df1.assign(e=e.values)

इस उदाहरण के अनुसार (जिसमें assignफ़ंक्शन का स्रोत कोड भी शामिल है ), आप एक से अधिक कॉलम भी शामिल कर सकते हैं:

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]})
>>> df.assign(mean_a=df.a.mean(), mean_b=df.b.mean())
   a  b  mean_a  mean_b
0  1  3     1.5     3.5
1  2  4     1.5     3.5

अपने उदाहरण के संदर्भ में:

np.random.seed(0)
df1 = pd.DataFrame(np.random.randn(10, 4), columns=['a', 'b', 'c', 'd'])
mask = df1.applymap(lambda x: x <-0.7)
df1 = df1[-mask.any(axis=1)]
sLength = len(df1['a'])
e = pd.Series(np.random.randn(sLength))

>>> df1
          a         b         c         d
0  1.764052  0.400157  0.978738  2.240893
2 -0.103219  0.410599  0.144044  1.454274
3  0.761038  0.121675  0.443863  0.333674
7  1.532779  1.469359  0.154947  0.378163
9  1.230291  1.202380 -0.387327 -0.302303

>>> e
0   -1.048553
1   -1.420018
2   -1.706270
3    1.950775
4   -0.509652
dtype: float64

df1 = df1.assign(e=e.values)

>>> df1
          a         b         c         d         e
0  1.764052  0.400157  0.978738  2.240893 -1.048553
2 -0.103219  0.410599  0.144044  1.454274 -1.420018
3  0.761038  0.121675  0.443863  0.333674 -1.706270
7  1.532779  1.469359  0.154947  0.378163  1.950775
9  1.230291  1.202380 -0.387327 -0.302303 -0.509652

इस नई सुविधा का वर्णन जब इसे पहली बार पेश किया गया था तो यहां पाया जा सकता है


2
दो तरीकों के सापेक्ष प्रदर्शन पर कोई टिप्पणी, यह देखते हुए कि पहली विधि ( df['e'] = e.values) डेटाफ्रेम की एक प्रति नहीं बनाती है, जबकि दूसरा विकल्प (उपयोग df.assign) करता है? अनुक्रमिक रूप से और बड़े डेटाफ़्रेम जोड़े जाने के बहुत से मामलों के मामले में मैं पहले तरीके के बेहतर प्रदर्शन की उम्मीद करूँगा।
jhin

2
@ हाँ, प्रत्यक्ष असाइनमेंट स्पष्ट रूप से बहुत है अगर आप एक निश्चित डेटाफ़्रेम पर काम कर रहे हैं। उपयोग करने assignका लाभ तब होता है जब चेन आपके ऑपरेशनों को एक साथ करती है।
अलेक्जेंडर

यह निश्चित रूप से स्पष्ट और निहित के बीच एक अच्छा संतुलन की तरह लगता है। +1: डी
अबे हॉफमैन

2
मौज-मस्ती के लिएdf.assign(**df.mean().add_prefix('mean_'))
विजय प्राप्त करें

1
@ ठीक है, इस सवाल से, ऐसा प्रतीत होता है कि ओपी केवल डेटाफ्रेम को समेट रहा है और सूचकांक की अनदेखी कर रहा है। यदि यह मामला है, तो ऊपर दिए गए तरीके काम करेंगे। यदि कोई अनुक्रमणिका को बनाए रखना चाहता है, तो कुछ ऐसा उपयोग करें df_new = pd.concat([df1, df2], axis=1), जो ignore_index=Falseडिफ़ॉल्ट रूप से ध्यान देने योग्य हो ।
अलेक्जेंडर

51

ऐसा लगता है कि हाल के पंडों के संस्करणों में जाने का तरीका df.assign का उपयोग करना है :

df1 = df1.assign(e=np.random.randn(sLength))

यह उत्पादन नहीं करता है SettingWithCopyWarning


1
ऊपर से @smci की टिप्पणी की नकल करना ... "वर्तमान में" या वर्षों के संदर्भ में कहने के बजाय, कृपया पंडों के संस्करण संख्याओं को देखें
काइल सी

50

NumPy के माध्यम से सीधे ऐसा करना सबसे कुशल होगा:

df1['e'] = np.random.randn(sLength)

ध्यान दें कि मेरा मूल (बहुत पुराना) सुझाव का उपयोग करना था map(जो बहुत धीमा है):

df1['e'] = df1['a'].map(lambda x: np.random.random())

1
आपके उत्तर के लिए धन्यवाद, जैसा कि मैंने पहले ही ई दिया है, क्या मैं आपके कोड को संशोधित कर सकता हूं, .mapइसके बजाय मौजूदा श्रृंखला का उपयोग करने के लिए lambda? मैं कोशिश करता हूं df1['e'] = df1['a'].map(lambda x: e)या df1['e'] = df1['a'].map(e)नहीं, लेकिन मुझे इसकी जरूरत नहीं है। (मैं अजगर के लिए नया हूं और आपके पिछले जवाब ने पहले ही मेरी मदद कर दी)
tomasz74

@ tomasz74 यदि आपके पास पहले से eही एक श्रृंखला है तो आपको उपयोग करने की आवश्यकता नहीं है map, df['e']=e(@joaquins उत्तर)।
एंडी हेडन

49

सुपर सरल स्तंभ असाइनमेंट

एक पंडों के डेटाफ्रेम को कॉलम के एक आदेशित हुक्म के रूप में लागू किया जाता है।

इसका मतलब है कि इसका __getitem__ []उपयोग न केवल एक निश्चित कॉलम प्राप्त करने के लिए किया जा सकता है, बल्कि__setitem__ [] = किया जा सकता है एक नए कॉलम को असाइन करने के लिए भी किया जा सकता है।

उदाहरण के लिए, इस dataframe बस का उपयोग करके एक स्तंभ इससे जुड़ा हो सकता है []एक्सेसर

    size      name color
0    big      rose   red
1  small    violet  blue
2  small     tulip   red
3  small  harebell  blue

df['protected'] = ['no', 'no', 'no', 'yes']

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

ध्यान दें कि यह काम करता है भले ही डेटाफ्रेम का सूचकांक बंद हो।

df.index = [3,2,1,0]
df['protected'] = ['no', 'no', 'no', 'yes']
    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

[] = जाने का रास्ता है, लेकिन बाहर देखो!

हालाँकि, यदि आपके पास कोई pd.Seriesडेटाफ़्रेम है, जहाँ अनुक्रमणिका बंद है, उसे असाइन करने का प्रयास करें , तो आप परेशानी में चलेंगे। उदाहरण देखें:

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'])
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

ऐसा इसलिए है क्योंकि pd.Seriesडिफ़ॉल्ट रूप से एक इंडेक्स 0 से n तक एनुमरेट किया गया है। और पांडा [] =विधि की कोशिश करता है "स्मार्ट" होने की है

वास्तव में क्या चल रहा है।

जब आप उपयोग करते हैं [] = विधि का पांडा बाएं हाथ के डेटाफ्रेम और दाहिने हाथ की श्रृंखला के सूचकांक का उपयोग करके चुपचाप एक बाहरी जुड़ाव या बाहरी मर्ज का प्रदर्शन करता है।df['column'] = series

पक्षीय लेख

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

समस्या के आसपास जाना

अगर आपके पास एक है pd.Series और चाहते हैं कि यह ऊपर से नीचे तक सौंपा जाए, या यदि आप उत्पादक कोड को कोड कर रहे हैं और आप सूचकांक आदेश के बारे में सुनिश्चित नहीं हैं, तो इस तरह के मुद्दे के लिए इसे सुरक्षित करना लायक है।

आप pd.Seriesएक np.ndarrayया एक डाउनकास्ट कर सकते हैं list, यह चाल चलेगा।

df['protected'] = pd.Series(['no', 'no', 'no', 'yes']).values

या

df['protected'] = list(pd.Series(['no', 'no', 'no', 'yes']))

लेकिन यह बहुत स्पष्ट नहीं है।

कुछ कोडर साथ आ सकते हैं और कहेंगे "अरे, यह बेमानी लग रहा है, मैं अभी इसे दूर कर दूँगा"।

स्पष्ट तरीका

का सूचकांक pd.Seriesहोना dfस्पष्ट है।

df['protected'] = pd.Series(['no', 'no', 'no', 'yes'], index=df.index)

या अधिक वास्तविक रूप से, आपके पास संभवतः pd.Seriesपहले से ही उपलब्ध है।

protected_series = pd.Series(['no', 'no', 'no', 'yes'])
protected_series.index = df.index

3     no
2     no
1     no
0    yes

अब सौंपा जा सकता है

df['protected'] = protected_series

    size      name color protected
3    big      rose   red        no
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue       yes

के साथ वैकल्पिक तरीका है df.reset_index()

के बाद से सूचकांक मतभेद समस्या है, अगर आपको लगता है कि dataframe के सूचकांक चाहिए बातें निर्देशित नहीं, तो आप बस सूचकांक ड्रॉप कर सकते हैं, इस तेजी से होना चाहिए, लेकिन यह बहुत साफ है के बाद से अपने कार्य अब नहीं है, शायद दो बातें करता है।

df.reset_index(drop=True)
protected_series.reset_index(drop=True)
df['protected'] = protected_series

    size      name color protected
0    big      rose   red        no
1  small    violet  blue        no
2  small     tulip   red        no
3  small  harebell  blue       yes

पर ध्यान दें df.assign

जबकि df.assignयह अधिक स्पष्ट तुम क्या कर रहे, यह वास्तव में इसके बाद के संस्करण के रूप में सभी एक ही समस्या है[]=

df.assign(protected=pd.Series(['no', 'no', 'no', 'yes']))
    size      name color protected
3    big      rose   red       yes
2  small    violet  blue        no
1  small     tulip   red        no
0  small  harebell  blue        no

बस यह देखें df.assignकि आपका कॉलम कहा नहीं गया है self। यह त्रुटियों का कारण होगा। यह df.assign बदबूदार बनाता है , क्योंकि समारोह में इस तरह की कलाकृतियां हैं।

df.assign(self=pd.Series(['no', 'no', 'no', 'yes'])
TypeError: assign() got multiple values for keyword argument 'self'

आप कह सकते हैं, "ठीक है, मैं अभी उपयोग नहीं करूंगा self"। लेकिन कौन जानता है कि भविष्य में नए तर्कों का समर्थन करने के लिए यह फ़ंक्शन कैसे बदलता है। हो सकता है कि आपके कॉलम का नाम पंडों के एक नए अपडेट में एक तर्क होगा, जिससे अपग्रेड के साथ समस्या हो सकती है।


6
" जब आप [] =विधि का उपयोग करते हैं तो पांडा चुपचाप एक बाहरी जोड़ या बाहरी मर्ज का प्रदर्शन कर रहा है "। यह पूरे विषय में सबसे महत्वपूर्ण जानकारी है। लेकिन क्या आप []=ऑपरेटर के काम करने के तरीके के बारे में आधिकारिक दस्तावेज को लिंक प्रदान कर सकते हैं ?
लाइटमैन

25

सबसे आसान तरीके: -

data['new_col'] = list_of_values

data.loc[ : , 'new_col'] = list_of_values

इस तरह से आप एक पैंडस ऑब्जेक्ट में नए मान सेट करते समय जंजीर अनुक्रमणिका को क्या कहते हैं, इससे बचते हैं। आगे पढ़ने के लिए यहां क्लिक करें


23

यदि आप पूरे नए कॉलम को प्रारंभिक आधार मान (जैसे None) पर सेट करना चाहते हैं , तो आप यह कर सकते हैं:df1['e'] = None

यह वास्तव में सेल को "ऑब्जेक्ट" प्रकार असाइन करेगा। इसलिए बाद में आप जटिल डेटा प्रकारों, जैसे सूची, को अलग-अलग कक्षों में रखने के लिए स्वतंत्र हैं।


1
यह एक सेटिंग को बढ़ा देता है
00__00__00

1
df ['E'] = ’’ भी काम करता है अगर कोई खाली कॉलम जोड़ना चाहता है
debaonline4u

21

मैं SettingWithCopyWarningघबरा गया, और यह इलोक सिंटैक्स का उपयोग करके तय नहीं किया गया था। मेरा DataFrame एक ODBC स्रोत से read_sql द्वारा बनाया गया था। निम्न के द्वारा एक सुझाव का उपयोग करते हुए, मेरे लिए निम्नलिखित ने काम किया:

df.insert(len(df.columns), 'e', pd.Series(np.random.randn(sLength),  index=df.index))

इसने कॉलम को अंत में डालने के लिए ठीक काम किया। मुझे नहीं पता कि यह सबसे कुशल है, लेकिन मुझे चेतावनी संदेश पसंद नहीं है। मुझे लगता है कि एक बेहतर समाधान है, लेकिन मुझे यह नहीं मिल रहा है, और मुझे लगता है कि यह सूचकांक के कुछ पहलू पर निर्भर करता है।
ध्यान दें । यदि यह केवल एक बार काम करता है और एक त्रुटि संदेश देगा यदि वह ओवरराइट करने और मौजूदा कॉलम की कोशिश कर रहा है।
नोट: जैसा कि ऊपर और 0.16.0 असाइनमेंट से सबसे अच्छा समाधान है। प्रलेखन देखें http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.assign.html#pandas.DataFrame.assign डेटा प्रवाह प्रकार के लिए अच्छी तरह से काम करता है जब आप अपने मध्यवर्ती मूल्यों को अधिलेखित नहीं करते हैं।


यह एकमात्र तरीका है जो 2019 में मेरे लिए काम करता है!
हाइड्रोनॉन

14
  1. पहले एक अजगर बनाएँ list_of_eजिसमें प्रासंगिक डेटा हो।
  2. इसे इस्तेमाल करो: df['e'] = list_of_e

1
मुझे वास्तव में समझ में नहीं आ रहा है, यह पसंदीदा उत्तर क्यों नहीं है। यदि आपके पास pd.Series है, तो tolist()कमांड मददगार हो सकती है।
अतः

11

यदि आप जिस स्तंभ को जोड़ने का प्रयास कर रहे हैं वह एक श्रृंखला चर है तो बस:

df["new_columns_name"]=series_variable_name #this will do it for you

यह तब भी अच्छी तरह से काम करता है जब आप किसी मौजूदा कॉलम की जगह ले रहे हों। नया टाइप करें। new_columns_name को आप जिस कॉलम को बदलना चाहते हैं। वह सिर्फ नए सीरीज डेटा के साथ मौजूदा कॉलम डेटा को ओवरराइट करेगा।


10

यदि डेटा फ़्रेम और सीरीज़ ऑब्जेक्ट में एक ही इंडेक्स है , तो pandas.concatयहाँ भी काम करता है:

import pandas as pd
df
#          a            b           c           d
#0  0.671399     0.101208   -0.181532    0.241273
#1  0.446172    -0.243316    0.051767    1.577318
#2  0.614758     0.075793   -0.451460   -0.012493

e = pd.Series([-0.335485, -1.166658, -0.385571])    
e
#0   -0.335485
#1   -1.166658
#2   -0.385571
#dtype: float64

# here we need to give the series object a name which converts to the new  column name 
# in the result
df = pd.concat([df, e.rename("e")], axis=1)
df

#          a            b           c           d           e
#0  0.671399     0.101208   -0.181532    0.241273   -0.335485
#1  0.446172    -0.243316    0.051767    1.577318   -1.166658
#2  0.614758     0.075793   -0.451460   -0.012493   -0.385571

मामले में वे एक ही सूचकांक नहीं है:

e.index = df.index
df = pd.concat([df, e.rename("e")], axis=1)

10

सरल:

df.loc[:, 'NewCol'] = 'New_Val'

उदाहरण:

df = pd.DataFrame(data=np.random.randn(20, 4), columns=['A', 'B', 'C', 'D'])

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
3  -0.147354  0.778707  0.479145  2.284143
4  -0.529529  0.000571  0.913779  1.395894
5   2.592400  0.637253  1.441096 -0.631468
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
8   0.606985 -2.232903 -1.358107 -2.855494
9  -0.692013  0.671866  1.179466 -1.180351
10 -1.093707 -0.530600  0.182926 -1.296494
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
18  0.693458  0.144327  0.329500 -0.655045
19  0.104425  0.037412  0.450598 -0.923387


df.drop([3, 5, 8, 10, 18], inplace=True)

df

           A         B         C         D
0  -0.761269  0.477348  1.170614  0.752714
1   1.217250 -0.930860 -0.769324 -0.408642
2  -0.619679 -1.227659 -0.259135  1.700294
4  -0.529529  0.000571  0.913779  1.395894
6   0.757178  0.240012 -0.553820  1.177202
7  -0.986128 -1.313843  0.788589 -0.707836
9  -0.692013  0.671866  1.179466 -1.180351
11 -0.143273 -0.503199 -1.328728  0.610552
12 -0.923110 -1.365890 -1.366202 -1.185999
13 -2.026832  0.273593 -0.440426 -0.627423
14 -0.054503 -0.788866 -0.228088 -0.404783
15  0.955298 -1.430019  1.434071 -0.088215
16 -0.227946  0.047462  0.373573 -0.111675
17  1.627912  0.043611  1.743403 -0.012714
19  0.104425  0.037412  0.450598 -0.923387

df.loc[:, 'NewCol'] = 0

df
           A         B         C         D  NewCol
0  -0.761269  0.477348  1.170614  0.752714       0
1   1.217250 -0.930860 -0.769324 -0.408642       0
2  -0.619679 -1.227659 -0.259135  1.700294       0
4  -0.529529  0.000571  0.913779  1.395894       0
6   0.757178  0.240012 -0.553820  1.177202       0
7  -0.986128 -1.313843  0.788589 -0.707836       0
9  -0.692013  0.671866  1.179466 -1.180351       0
11 -0.143273 -0.503199 -1.328728  0.610552       0
12 -0.923110 -1.365890 -1.366202 -1.185999       0
13 -2.026832  0.273593 -0.440426 -0.627423       0
14 -0.054503 -0.788866 -0.228088 -0.404783       0
15  0.955298 -1.430019  1.434071 -0.088215       0
16 -0.227946  0.047462  0.373573 -0.111675       0
17  1.627912  0.043611  1.743403 -0.012714       0
19  0.104425  0.037412  0.450598 -0.923387       0

2
मूर्ख नहीं। यह ओपी के प्रश्न को संबोधित नहीं करता है, जो एक ऐसा मामला है जहां मौजूदा डेटाफ्रेम और नई श्रृंखला के सूचकांक संरेखित नहीं होते हैं।
अलेक्जेंडर

7

मुझे सिर्फ 3 को जोड़ना है, जैसे hum3 के लिए , .locहल नहीं किया SettingWithCopyWarningऔर मुझे इसका सहारा लेना पड़ा df.insert()। मेरे मामले में "नकली" श्रृंखला अनुक्रमण द्वारा गलत सकारात्मक उत्पन्न किया गया था dict['a']['e'], जहां 'e'नया कॉलम है, और dict['a']शब्दकोश से आने वाला डेटाफ़्रेम है।

यह भी ध्यान दें कि यदि आप जानते हैं कि आप क्या कर रहे हैं, तो आप pd.options.mode.chained_assignment = None यहां दिए गए अन्य समाधानों में से एक का उपयोग करके और उपयोग करके चेतावनी को स्विच कर सकते हैं।


7

किसी दिए गए स्थान पर एक नया कॉलम सम्मिलित करने के लिए (0 <= loc <= कॉलम की मात्रा) एक डेटा फ्रेम में, बस Dataframe.inster का उपयोग करें:

DataFrame.insert(loc, column, value)

इसलिए, यदि आप कॉल किए गए डेटा फ़्रेम के अंत में कॉलम जोड़ना चाहते हैं dfउपयोग कर सकते हैं:

e = [-0.335485, -1.166658, -0.385571]    
DataFrame.insert(loc=len(df.columns), column='e', value=e)

मान एक श्रृंखला, एक पूर्णांक (जिस स्थिति में सभी सेल इस एक मान से भर जाते हैं), या एक सरणी जैसी संरचना हो सकती है

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.insert.html


6

नया कॉलम असाइन करने से पहले, यदि आपके पास अनुक्रमित डेटा है, तो आपको सूचकांक को क्रमबद्ध करने की आवश्यकता है। कम से कम मेरे मामले में मुझे:

data.set_index(['index_column'], inplace=True)
"if index is unsorted, assignment of a new column will fail"        
data.sort_index(inplace = True)
data.loc['index_value1', 'column_y'] = np.random.randn(data.loc['index_value1', 'column_x'].shape[0])

6

एक बात ध्यान दें, हालांकि, अगर आप करते हैं

df1['e'] = Series(np.random.randn(sLength), index=df1.index)

यह प्रभावी रूप से एक हो जाएगा छोड़ दिया df1.index पर शामिल हो। इसलिए यदि आप एक बाहरी जुड़ाव प्रभाव चाहते हैं, तो मेरा संभवतः अपूर्ण समाधान आपके डेटा के ब्रह्मांड को कवर करने वाले सूचकांक मूल्यों के साथ एक डेटाफ्रेम बनाना है, और फिर ऊपर दिए गए कोड का उपयोग करना है। उदाहरण के लिए,

data = pd.DataFrame(index=all_possible_values)
df1['e'] = Series(np.random.randn(sLength), index=df1.index)

5

मैं numpy.nanबिना डंबल के डेटाफ्रेम में एस के कॉलम को जोड़ने के सामान्य तरीके की तलाश कर रहा था SettingWithCopyWarning

निम्नलिखित में से:

मैं इसके साथ आया:

col = 'column_name'
df = df.assign(**{col:numpy.full(len(df), numpy.nan)})

4

मौजूदा डेटा फ़्रेम में एक नया कॉलम, 'ई' जोड़ने के लिए

 df1.loc[:,'e'] = Series(np.random.randn(sLength))

यह चेतावनी संदेश भी देता है
B Furtado

आपको df1.loc का उपयोग करना चाहिए [::, 'e'] = Series (np.random.randn (sLength))
हर्मीस मोरालेस

4

पूर्णता के लिए - अभी तक DataFrame.eval () विधि का उपयोग कर एक और समाधान :

डेटा:

In [44]: e
Out[44]:
0    1.225506
1   -1.033944
2   -0.498953
3   -0.373332
4    0.615030
5   -0.622436
dtype: float64

In [45]: df1
Out[45]:
          a         b         c         d
0 -0.634222 -0.103264  0.745069  0.801288
4  0.782387 -0.090279  0.757662 -0.602408
5 -0.117456  2.124496  1.057301  0.765466
7  0.767532  0.104304 -0.586850  1.051297
8 -0.103272  0.958334  1.163092  1.182315
9 -0.616254  0.296678 -0.112027  0.679112

समाधान:

In [46]: df1.eval("e = @e.values", inplace=True)

In [47]: df1
Out[47]:
          a         b         c         d         e
0 -0.634222 -0.103264  0.745069  0.801288  1.225506
4  0.782387 -0.090279  0.757662 -0.602408 -1.033944
5 -0.117456  2.124496  1.057301  0.765466 -0.498953
7  0.767532  0.104304 -0.586850  1.051297 -0.373332
8 -0.103272  0.958334  1.163092  1.182315  0.615030
9 -0.616254  0.296678 -0.112027  0.679112 -0.622436

4

एक खाली कॉलम बनाने के लिए

df['i'] = None

3

निम्नलिखित वही है जो मैंने किया था ... लेकिन मैं सामान्य रूप से पांडा और वास्तव में अजगर के लिए बहुत नया हूं, इसलिए कोई वादा नहीं करता।

df = pd.DataFrame([[1, 2], [3, 4], [5,6]], columns=list('AB'))

newCol = [3,5,7]
newName = 'C'

values = np.insert(df.values,df.shape[1],newCol,axis=1)
header = df.columns.values.tolist()
header.append(newName)

df = pd.DataFrame(values,columns=header)

3

यदि आपको यह मिल जाता है SettingWithCopyWarning, तो एक आसान तय यह है कि आप जिस DataFrame को जोड़ने के लिए एक कॉलम जोड़ने की कोशिश कर रहे हैं उसे कॉपी करें।

df = df.copy()
df['col_name'] = values

10
यह एक अच्छा विचार नहीं है। यदि डेटाफ़्रेम काफी बड़ा है, तो यह मेमोरी इंटेंसिव होने वाला है ... यदि आप हर बार एक बार में कॉलम जोड़ते रहते हैं, तो यह बुरे सपने में बदल जाएगा।
केवद
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.