सूची से डेटाफ़्रेम में कॉलम जोड़ें


95

मेरे पास कुछ कॉलम के साथ एक डेटाफ्रेम है:

A   B   C  
0   
4
5
6
7
7
6
5

ए में मूल्यों की संभावित सीमा केवल 0 से 7 तक है

इसके अलावा, मेरे पास इस तरह के 8 तत्वों की सूची है:

List=[2,5,6,8,12,16,26,32]  //There are only 8 elements in this list

यदि स्तंभ A में तत्व n है , तो मुझे n स्तंभ में सूची से n तत्व को सम्मिलित करना होगा , 'D' कहें।

पूरे डेटाफ़्रेम पर लूपिंग के बिना मैं इसे कैसे कर सकता हूं?

परिणामी डेटाफ्रेम इस तरह दिखेगा:

A   B   C   D
0           2
4           12
5           16
6           26
7           32
7           32
6           26
5           16

नोट: डेटाफ्रेम विशाल है और पुनरावृति अंतिम विकल्प विकल्प है। लेकिन मैं किसी अन्य डेटा संरचना में 'सूची' में तत्वों को व्यवस्थित कर सकता हूं, यदि आवश्यक हो तो तानाशाही जैसी।


1
मुझे लगता है कि आपको वांछित परिणाम के साथ (छोटे) खिलौना उदाहरण की आवश्यकता है। यह थोड़ा अस्पष्ट लगता है।
एंडी हेडन

11
कभी भी एक चर "सूची" को कॉल न करें। किसी भी भाषा में।
ल्यूसिड_ड्रीमर

जवाबों:


51

IIUC, यदि आप अपना (दुर्भाग्य से नाम) Listएक में बनाते हैं, तो आप ndarrayइसे स्वाभाविक रूप से अनुक्रमित कर सकते हैं।

>>> import numpy as np
>>> m = np.arange(16)*10
>>> m[df.A]
array([  0,  40,  50,  60, 150, 150, 140, 130])
>>> df["D"] = m[df.A]
>>> df
    A   B   C    D
0   0 NaN NaN    0
1   4 NaN NaN   40
2   5 NaN NaN   50
3   6 NaN NaN   60
4  15 NaN NaN  150
5  15 NaN NaN  150
6  14 NaN NaN  140
7  13 NaN NaN  130

यहां मैंने एक नया निर्माण किया m, लेकिन यदि आप उपयोग करते हैं m = np.asarray(List), तो एक ही काम करना चाहिए: मूल्यों में df.Aउपयुक्त तत्वों को चुना जाएगा m


ध्यान दें कि यदि आप एक पुराने संस्करण का उपयोग कर रहे हैं numpy, तो आपको m[df.A.values]इसके बजाय उपयोग करना पड़ सकता है - अतीत में, numpyदूसरों के साथ अच्छा नहीं खेला, और pandasकुछ सिरदर्द के कारण कुछ रिफैक्टरिंग । अब हालात सुधर गए हैं।


हाय @DSM। मुझे वही मिल रहा है जो आप कह रहे हैं लेकिन मुझे यह त्रुटि मिल रही है: Traceback (most recent call last): File "./b.py", line 24, in <module> d["D"] = m[d.A] IndexError: unsupported iterator index
mane

1
@mane: urf, यह एक पुराना numpyबग है। d["D"] = m[d.A.values]आपके लिए काम करता है ?
डीएसएम

278

बस सीधे सूची असाइन करें:

df['new_col'] = mylist

वैकल्पिक
सूची को श्रृंखला या सरणी में बदलें और फिर असाइन करें:

se = pd.Series(mylist)
df['new_col'] = se.values

या

df['new_col'] = np.array(mylist)

3
pykernel_launcher.py:1: SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame. Try using .loc[row_indexer,col_indexer] = value instead See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy """Entry point for launching an IPython kernel.
इल्या रूसिन

@स्पोर्ट dtype pd.Seriesप्रभाव का उपयोग करेगा ? मेरा मतलब है कि यह फ्लोट्स और स्ट्रिंग्स के रूप में फ्लोट्स को छोड़ देगा? या सूची में तत्व स्ट्रिंग के लिए डिफ़ॉल्ट होंगे?
3kstc

2
@IlyaRusin, यह एक गलत सकारात्मक है जिसे इस मामले में अनदेखा किया जा सकता है। अधिक जानकारी के लिए: stackoverflow.com/questions/20625582/…
गौरैया

1
इसे सरल बनाया जा सकता है: df ['new_col'] = pd.Series (mylist) .values
19

16

@Sparrow से महान पर एक समाधान में सुधार।

चलो df , आपके डेटासेट हो, और MyList मूल्यों आप dataframe में जोड़ना चाहते हैं के साथ सूची।

मान लीजिए कि आप अपने नए कॉलम को बस नया कहना चाहते हैं, तो new_column

पहले एक श्रृंखला में सूची बनाओ:

column_values = pd.Series(mylist)

फिर कॉलम जोड़ने के लिए इंसर्ट फंक्शन का उपयोग करें। इस फ़ंक्शन का लाभ यह है कि आपको यह चुनने की सुविधा है कि आप किस स्थिति में कॉलम रखना चाहते हैं। निम्नलिखित उदाहरण में हम नए कॉलम को बाएं से पहली स्थिति में रखेंगे (लोकेशन सेट करके = 0)

df.insert(loc=0, column='new_column', value=column_values)

यह काम नहीं करेगा यदि आपने df के अपने अनुक्रमित को किसी अन्य चीज़ में बदल दिया है तो 1,2,3 ... उस स्थिति में आपको लाइनों के बीच जोड़ना होगा: column_values.index = df.index
लड़के s

8

पहले चलो आपके द्वारा बनाई गई डेटाफ़्रेम बनाएं, मैं कॉलम बी और सी को अनदेखा कर दूंगा क्योंकि वे प्रासंगिक नहीं हैं।

df = pd.DataFrame({'A': [0, 4, 5, 6, 7, 7, 6,5]})

और आप चाहते हैं कि मानचित्रण:

mapping = dict(enumerate([2,5,6,8,12,16,26,32]))

df['D'] = df['A'].map(mapping)

किया हुआ!

print df

आउटपुट:

   A   D
0  0   2
1  4  12
2  5  16
3  6  26
4  7  32
5  7  32
6  6  26
7  5  16

1
मुझे लगता है कि ओपी जानता है कि यह कैसे करना है। मेरे पढ़ने से इस मुद्दे का निर्माण Dहो रहा है Aऔर List("यदि स्तंभ A में तत्व n है, तो मुझे n तत्व को नए कॉलम में सूची से सम्मिलित करना होगा, 'D' कहें")
DSM

SO कुछ प्रकार के F (* & नानी अवस्था) में बदल गया है। टिप्पणी के लिए @DSM को धन्यवाद, लेकिन मैं उस पोस्ट अनिल को सही नहीं कर सका, जिसकी समीक्षा की गई थी। और फिर इसे अस्वीकार कर दिया गया क्योंकि यह बहुत तेज़ था और तब मैंने। ।। अपने खुद के संपादन की समीक्षा सहकर्मी करने में सक्षम हैं और फिर बहुत देर हो चुकी है क्योंकि एक भी बदतर (IMHO) जवाब था "स्वीकार किए जाते हैं" है, तो वास्तव में कुछ मेटा-नानी कौन मददगार की तुलना में कम कर रहे हैं मिल गया है !!!!
फिल कूपर

ठीक है, मैं नन्नियों के लिए बात नहीं कर सकता, लेकिन आप पाएंगे कि आपका दृष्टिकोण लंबी सरणियों पर परिमाण धीमे क्रम के बारे में है। अन्य मामलों में, ज़ाहिर है, के बीच चयन करना np.array(List)[df.A]और df["A"].map(dict(enumerate(List)))ज्यादातर वरीयता का मामला है।
DSM

हाय फिल, मैंने केवल आपके समाधान और डीएसएम की टिप्पणी को देखा और फिर कभी भी इसे वापस नहीं लिया क्योंकि डीएसएम के समाधान ने मेरे लिए ठीक काम किया। लेकिन अब आपके समाधान को देखते हुए, यह भी काम करता है। मैंने लगभग 200k प्रविष्टियों के अपने डेटासेट पर DSM के समाधान को चलाया है और यह कुछ सेकंड में अन्य गणनाओं के साथ चलता है जो मेरे पास हैं। मैं अजगर-पांडा के लिए पूरी तरह से नया हूं और व्यक्तिगत रूप से सुरुचिपूर्ण या महान कुछ भी नहीं ढूंढ रहा था; जो भी काम किया ठीक था। लेकिन ईमानदारी से, समाधान के लिए धन्यवाद।
माने

2

पुराना सवाल; लेकिन मैं हमेशा सबसे तेज़ कोड का उपयोग करने की कोशिश करता हूं!

मेरे पास 69 मिलियन यूइंट64 के साथ एक विशाल सूची थी। np.array () मेरे लिए सबसे तेज़ था।

df['hashes'] = hashes
Time spent: 17.034842014312744

df['hashes'] = pd.Series(hashes).values
Time spent: 17.141014337539673

df['key'] = np.array(hashes)
Time spent: 10.724546194076538
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.