python - पाइथन पांडा में मौजूदा डेटाफ्रेम में नया कॉलम जोड़ना




pandas dataframe (14)

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

          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

मैंने join , append , merge करने के विभिन्न संस्करणों की कोशिश की, लेकिन मुझे नतीजा नहीं मिला, केवल सबसे ज्यादा त्रुटियां। मैं उपरोक्त उदाहरण में कॉलम e कैसे जोड़ सकता हूं?


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

मुझे लगता है कि e में इंडेक्स वैल्यू उन लोगों से मेल खाते हैं जो df1

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

df['e'] = e.values

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

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

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

पहली बार पेश किए जाने पर इस नई सुविधा का विवरण here पाया जा सकता here


सुपर सरल कॉलम असाइनमेंट

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

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

उदाहरण के लिए, इस डेटाफ्रेम में [] एक्सेसर का उपयोग करके इसमें एक कॉलम जोड़ा जा सकता है

    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 और इसे 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 से एन के लिए एक सूचकांक है। और पांडा [] = विधि "स्मार्ट" होने का प्रयास करती है

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

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

पक्षीय लेख

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

समस्या के चारों ओर जा रहे हैं

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

आप pd.Series को np.ndarray या list np.ndarray सकते हैं, यह चाल करेगा।

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

या

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

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

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

स्पष्ट तरीका

pd.Series की अनुक्रमणिका होने के लिए pd.Series की अनुक्रमणिका सेट करना स्पष्ट है।

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() साथ वैकल्पिक तरीका

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

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 साथ df.assign कि आपके कॉलम को self नहीं कहा जाता है। यह त्रुटियों का कारण बन जाएगा। यह df.assign smelly बनाता है, क्योंकि इस तरह के कलाकृतियों समारोह में हैं।

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

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


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

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

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


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

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)

नया कॉलम निर्दिष्ट करने से पहले, यदि आपने डेटा अनुक्रमित किया है, तो आपको इंडेक्स को सॉर्ट करना होगा। कम से कम मेरे मामले में मुझे यह करना था:

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])

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

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)

मुझे SettingWithCopyWarning मिला, और यह iloc वाक्यविन्यास का उपयोग करके तय नहीं किया गया था। मेरा डेटाफ्रेम एक ओडीबीसी स्रोत से 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 डेटा प्रवाह प्रकार के लिए अच्छी तरह से काम करता है जहां आप अपने मध्यवर्ती मानों को ओवरराइट नहीं करते हैं।


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

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


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

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

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

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

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


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

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

यदि डेटा फ्रेम और सीरीज़ ऑब्जेक्ट में एक ही इंडेक्स है , तो 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)

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

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

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

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

सरल:

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




chained-assignment