पायथन पांडा एक सेल में सूची सम्मिलित करते हैं


106

मेरे पास एक सूची 'एबीसी' और एक डेटाफ्रेम 'डीएफ' है:

abc = ['foo', 'bar']
df =
    A  B
0  12  NaN
1  23  NaN

मैं सेल 1 बी में सूची सम्मिलित करना चाहता हूं, इसलिए मैं यह परिणाम चाहता हूं:

    A  B
0  12  NaN
1  23  ['foo', 'bar']

हो मैं ऐसा कर सकता हूं?

1) अगर मैं इसका उपयोग करता हूं:

df.ix[1,'B'] = abc

मुझे निम्न त्रुटि संदेश मिलता है:

ValueError: Must have equal len keys and value when setting with an iterable

क्योंकि यह सूची को सम्मिलित करने का प्रयास करता है (जिसमें दो तत्व हैं) एक पंक्ति / स्तंभ में लेकिन एक सेल में नहीं।

2) अगर मैं इसका उपयोग करता हूं:

df.ix[1,'B'] = [abc]

फिर यह एक सूची सम्मिलित करता है जिसमें केवल एक तत्व है जो 'एबीसी' सूची ( [['foo', 'bar']]) है।

3) अगर मैं इसका उपयोग करता हूं:

df.ix[1,'B'] = ', '.join(abc)

फिर यह एक स्ट्रिंग सम्मिलित करता है: ( foo, bar) लेकिन सूची नहीं।

4) अगर मैं इसका उपयोग करता हूं:

df.ix[1,'B'] = [', '.join(abc)]

फिर यह एक सूची सम्मिलित करता है, लेकिन इसमें केवल एक तत्व ( ['foo, bar']) है, लेकिन दो नहीं जैसा मैं चाहता हूं ( ['foo', 'bar'])।

सहायता के लिए धन्यवाद!


संपादित करें

मेरी नई डेटाफ़्रेम और पुरानी सूची:

abc = ['foo', 'bar']
df2 =
    A    B         C
0  12  NaN      'bla'
1  23  NaN  'bla bla'

एक और डेटाफ़्रेम:

df3 =
    A    B         C                    D
0  12  NaN      'bla'  ['item1', 'item2']
1  23  NaN  'bla bla'        [11, 12, 13]

मैं 'एबीसी' सूची में df2.loc[1,'B']और / या सम्मिलित करना चाहता हूं df3.loc[1,'B']

यदि डेटाफ़्रेम में केवल पूर्णांक मान और / या NaN मान और / या सूची मान के साथ कॉलम हैं, तो पूरी तरह से एक सेल में सूची सम्मिलित करना कार्य करता है। यदि डेटाफ़्रेम में केवल स्ट्रिंग मान और / या NaN मान और / या सूची मान हैं, तो पूरी तरह से एक सेल कार्य में एक सूची सम्मिलित करना। लेकिन अगर डेटाफ़्रेम में पूर्णांक और स्ट्रिंग मान और अन्य कॉलम के साथ कॉलम हैं, तो त्रुटि संदेश प्रकट होता है यदि मैं इसका उपयोग करता हूं: df2.loc[1,'B'] = abcया df3.loc[1,'B'] = abc

एक और डेटाफ़्रेम:

df4 =
          A     B
0      'bla'  NaN
1  'bla bla'  NaN

ये आवेषण पूरी तरह से काम करते हैं: df.loc[1,'B'] = abcया df4.loc[1,'B'] = abc


1
क्या संस्करण पांडा आप उपयोग कर रहे हैं? निम्नलिखित ने पांडा का उपयोग करके काम किया 0.15.0:df.loc[1,'b'] = ['foo','bar']
EdChum

धन्यवाद! मैं पायथन 2.7 का उपयोग करता हूं और मैंने 0.14.0 और 0.15.0 पांडा की कोशिश की और यह ऊपर दिए गए परीक्षण डेटा के साथ काम करता है। लेकिन क्या होगा अगर मेरे पास कुछ पूर्णांक मानों के साथ 'C' कॉलम है? ए ’में तार होते हैं। एक पूर्णांक स्तंभ और एक srting कॉलम होने से मुझे एक ही त्रुटि मिलती है: ValueError: एक पुनरावृत्ति के साथ सेट करते समय बराबर लेन कीज़ और वैल्यू होनी चाहिए
ragesz

आपको समझाने और दिखाने का मतलब बताने के लिए डेटा और कोड पोस्ट करना होगा
EdChum

जवाबों:


121

चूंकि संस्करण 0.21.0 से हटाset_value दिया गया है , अब आपको उपयोग करना चाहिए । यह एक सेल में एक सूची को सम्मिलित करता है जैसे कि बिना ऊपर उठाए । मुझे लगता है कि यह इसलिए है क्योंकि हमेशा एक मूल्य को संदर्भित करता है, जबकि मूल्यों के साथ-साथ पंक्तियों और स्तंभों को भी संदर्भित कर सकता है।atValueErrorlocat loc

df = pd.DataFrame(data={'A': [1, 2, 3], 'B': ['x', 'y', 'z']})

df.at[1, 'B'] = ['m', 'n']

df =
    A   B
0   1   x
1   2   [m, n]
2   3   z

आपको यह भी सुनिश्चित करना होगा कि आप जिस कॉलम में प्रवेश कर रहे हैं dtype=object। उदाहरण के लिए

>>> df = pd.DataFrame(data={'A': [1, 2, 3], 'B': [1,2,3]})
>>> df.dtypes
A    int64
B    int64
dtype: object

>>> df.at[1, 'B'] = [1, 2, 3]
ValueError: setting an array element with a sequence

>>> df['B'] = df['B'].astype('object')
>>> df.at[1, 'B'] = [1, 2, 3]
>>> df
   A          B
0  1          1
1  2  [1, 2, 3]
2  3          3

4
मुझे यह सुनिश्चित करना था कि मूल डेटाफ्रेम dtype को इस काम के लिए निर्धारित किया गया था:df = pd.DataFrame(data, dtype=object)
Takver

2
एक सूचकांक की जरूरत है। मैं किसी अन्य विशेषता मान मिलान का उपयोग करके पंक्ति को कैसे संदर्भित करूं; उदाहरण के लिए: उपरोक्त उदाहरण में A = 2 के साथ पंक्ति के लिए?
bikashg

8
यह एक और त्रुटि देता है ValueError: setting an array element with a sequence.; त्रुटि मिलने पर @ cs95 द्वारा उत्तर देखें।
ब्लैसजार्ड

39

df3.set_value(1, 'B', abc)किसी भी डेटाफ्रेम के लिए काम करता है। कॉलम 'बी' के डेटा प्रकार का ध्यान रखें। उदाहरण के लिए। एक सूची को फ्लोट कॉलम में नहीं डाला जा सकता है, उस स्थिति में df['B'] = df['B'].astype(object)मदद कर सकता है।


6
ध्यान दें कि यह आदेश हटा दिया गया है । नीचे एक अपडेट है।
थॉमस

35

पंडों> = 0.21

set_valueपदावनत कर दिया गया है। अब आप DataFrame.atलेबल DataFrame.iatद्वारा सेट करने के लिए और पूर्णांक स्थिति द्वारा सेट करने के लिए उपयोग कर सकते हैं ।

at/ के साथ सेल वैल्यू सेट करनाiat

# Setup
df = pd.DataFrame({'A': [12, 23], 'B': [['a', 'b'], ['c', 'd']]})
df

    A       B
0  12  [a, b]
1  23  [c, d]

df.dtypes

A     int64
B    object
dtype: object

यदि आप "B" की दूसरी पंक्ति में कुछ नई सूची में मान सेट करना चाहते हैं, तो उपयोग करें DataFrane.at:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

आप पूर्णांक स्थिति का उपयोग करके भी सेट कर सकते हैं DataFrame.iat

df.iat[1, df.columns.get_loc('B')] = ['m', 'n']
df

    A       B
0  12  [a, b]
1  23  [m, n]

क्या होगा यदि मैं प्राप्त ValueError: setting an array element with a sequence?

मैं इसके साथ पुन: पेश करने की कोशिश करूंगा:

df

    A   B
0  12 NaN
1  23 NaN

df.dtypes

A      int64
B    float64
dtype: object

df.at[1, 'B'] = ['m', 'n']
# ValueError: setting an array element with a sequence.

इसका कारण यह है कि आपकी वस्तु float64dtype की है, जबकि सूचियां objects हैं, इसलिए वहां एक बेमेल है। इस स्थिति में आपको जो करना होगा, वह है कि कॉलम को पहले ऑब्जेक्ट में बदलना है।

df['B'] = df['B'].astype(object)
df.dtypes

A     int64
B    object
dtype: object

फिर, यह काम करता है:

df.at[1, 'B'] = ['m', 'n']
df

    A       B
0  12     NaN
1  23  [m, n]

संभव, लेकिन हैकी

इससे भी अधिक निराला, मैंने पाया है कि DataFrame.locयदि आप नेस्टेड सूची से गुजरते हैं तो आप कुछ इसी तरह हासिल कर सकते हैं ।

df.loc[1, 'B'] = [['m'], ['n'], ['o'], ['p']]
df

    A             B
0  12        [a, b]
1  23  [m, n, o, p]

आप इस बारे में अधिक पढ़ सकते हैं कि यह यहां क्यों काम करता है।


2

जैसा कि इस पोस्ट पंडों में उल्लेख किया गया है : डेटाफ़्रेम में सूची कैसे संग्रहीत करें? ; डेटाफ़्रेम में dtypes परिणामों को प्रभावित कर सकता है, साथ ही डेटाफ़्रेम को कॉल कर सकता है या नहीं सौंपा जा सकता है।


2

चारों ओर त्वरित काम

बस एक नई सूची के भीतर सूची संलग्न करें, जैसा कि नीचे डेटा फ्रेम में col2 के लिए किया गया है। कारण यह है कि यह काम करता है कि अजगर बाहरी सूची (सूचियों) को लेता है और इसे एक स्तंभ में परिवर्तित करता है जैसे कि यह सामान्य स्केलर आइटम होता है, जो हमारे मामले में सूची है और सामान्य स्केलर नहीं है।

mydict={'col1':[1,2,3],'col2':[[1, 4], [2, 5], [3, 6]]}
data=pd.DataFrame(mydict)
data


   col1     col2
0   1       [1, 4]
1   2       [2, 5]
2   3       [3, 6]

0

भी हो रही है

ValueError: Must have equal len keys and value when setting with an iterable,

.at के बजाय .loc का उपयोग करने से मेरे मामले में कोई फर्क नहीं पड़ा, लेकिन डेटाफ्रेम कॉलम के डेटाटाइप को लागू करने से यह चाल चली गई:

df['B'] = df['B'].astype(object)

तब मैं अपने डेटाफ़्रेम में एकल कक्ष मानों के रूप में सूचियाँ, संख्यात्मक सारणी और सभी प्रकार की चीज़ें सेट कर सकता था।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.