पंडों के डेटा फ्रेम में स्तंभ के रूप में संख्यात्मक सरणी जोड़ें


85

मेरे पास आकार (एक्स, वाई) आकार की एक पंडस डेटा फ़्रेम ऑब्जेक्ट है जो इस तरह दिखता है:

[[1, 2, 3],
[4, 5, 6],
[7, 8, 9]]

और आकार का एक खस्ता विरल मैट्रिक्स (CSC) (X, Z) ऐसा कुछ दिखता है

[[0, 1, 0],
[0, 0, 1],
[1, 0, 0]]

मैं एक नए नाम वाले कॉलम में मैट्रिक्स से डेटा फ़्रेम में सामग्री कैसे जोड़ सकता हूं, जिससे डेटा फ़्रेम इस तरह समाप्त हो जाएगा:

[[1, 2, 3, [0, 1, 0]],
[4, 5, 6, [0, 0, 1]],
[7, 8, 9, [1, 0, 0]]]

ध्यान दें कि डेटा फ़्रेम में अब आकार (X, Y + 1) है और मैट्रिक्स से पंक्तियाँ डेटा फ़्रेम में तत्व हैं।


2
इस तरह के घोंसले को हतोत्साहित किया जाता है। आपको ऐसा करने की आवश्यकता क्यों है?
फिलिप क्लाउड

इस प्रश्न को देखें: stackoverflow.com/q/18641148/564538
फिलिप क्लाउड

मैं मर्ज के बाद एकल कॉलम नाम से मैट्रिक्स की पिछली सामग्री का चयन करने की संभावना को बनाए रखना चाहता हूं।
मिहाई दामियन

तुम सिर्फ दो DataFrameएस का उपयोग क्यों नहीं करते ?
फिलिप क्लाउड

जवाबों:


81
import numpy as np
import pandas as pd
import scipy.sparse as sparse

df = pd.DataFrame(np.arange(1,10).reshape(3,3))
arr = sparse.coo_matrix(([1,1,1], ([0,1,2], [1,2,0])), shape=(3,3))
df['newcol'] = arr.toarray().tolist()
print(df)

पैदावार

   0  1  2     newcol
0  1  2  3  [0, 1, 0]
1  4  5  6  [0, 0, 1]
2  7  8  9  [1, 0, 0]

6
मुझे लगता है कि हम वास्तव में उन उपयोगकर्ताओं के लिए बुलेटप्रूफ जूते प्रदान नहीं कर सकते हैं जो इस तरह की चीजें करने पर जोर देते हैं: /
फिलिप क्लाउड

6
कर रहे हैं दिलचस्प बातें आप सूचियों का एक स्तंभ के साथ क्या कर सकते हैं , इसलिए मैं नहीं बल्कि यह न समझें कि हम इस रखना एक बुरा विचार है। हालांकि मैं मानता हूं कि एक उच्च संभावना है कि यह है।
unutbu

1
यह pandasलचीलेपन का एक अद्भुत उदाहरण है। इस प्रश्न के मामले में , डेटा पहले से ही समान आकार की पंक्तियों के साथ सजातीय संख्यात्मक प्रकार के हैं, जबकि उस उदाहरण में वे listअलग-अलग लंबाई के हैं। मैं मानता हूं कि ऐसी दिलचस्प चीजें हैं जो आप कर सकते हैं। हालाँकि, जब आपको पहले से ही एक मैट्रिक्स मिल गया है तो इसे सूचियों की सूची में क्यों बदल दें?
फिलिप क्लाउड

1
"दिलचस्प बात" है ... यह अब सूचियों का एक स्तंभ नहीं बना रहा है (इसलिए यह उपयोगी है)!
एंडी हेडन

54
दुनिया एक बेहतर जगह है जब रचनात्मक लोगों को उन चीजों को करने की अनुमति दी जाती है जो हर किसी को लगता है कि बेवकूफ है। :)
५११

10

अपने कॉलम में किसी सरणी को संग्रहीत करने के बजाय एक उच्च आयामी डेटास्ट्रक्चर (एक पैनल ) का उपयोग करने पर विचार करें:

In [11]: p = pd.Panel({'df': df, 'csc': csc})

In [12]: p.df
Out[12]: 
   0  1  2
0  1  2  3
1  4  5  6
2  7  8  9

In [13]: p.csc
Out[13]: 
   0  1  2
0  0  1  0
1  0  0  1
2  1  0  0

क्रॉस-सेक्शन आदि को देखें, आदि, आदि।

In [14]: p.xs(0)
Out[14]: 
   csc  df
0    0   1
1    1   2
2    0   3

पैनलों पर अधिक के लिए डॉक्स देखें


12
अब पैनल को हटा दिया गया है
गुहुर

हां, आमतौर पर आजकल मल्टीएंडेक्स की सिफारिश की जाती है। के माध्यम से बनाया गया pd.concat([df, csc], axis=1, keys=["df", "csc"])
एंडी हेडन

A = np.eye(3); df = pd.concat( [A,A], axis=1 )-> TypeError: 20.2 में एक गैर-एनडीफ्रेम वस्तु को समाप्‍त नहीं कर सकता है? ("पंडों-पदावनत-अब-उपयोग-यह" की एक विकी अच्छी होगी।)
डेनिस

@ हेडिस कोशिशA = pd.DataFrame(np.eye(3)); df = pd.concat( [A,A], axis=1, keys=["A", "B"] )
एंडी हेडन

धन्यवाद, df.columns MultiIndex(levels=[[u'A', u'B'], [0, 1, 2]](थप्पड़ माथे से)
डेनिस

3

यहाँ अन्य उदाहरण है:

import numpy as np
import pandas as pd

""" This just creates a list of touples, and each element of the touple is an array"""
a = [ (np.random.randint(1,10,10), np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]

""" Panda DataFrame will allocate each of the arrays , contained as a touple 
element , as column"""
df = pd.DataFrame(data =a,columns=['random_num','sequential_num'])

सामान्य रूप से रहस्य डेटा को a = [(array_11, array_12, ..., array_1n), ..., (array_m1, array_m2, ..., array_mn) और पांडा फॉरेफ्रेम में डेटा आवंटित करने के लिए है। एन के कॉलम में। बेशक, एरे के सरणियों का उपयोग टौप्स के बजाय किया जा सकता था, उस स्थिति में यह रूप होगा: a = [[array_11, array_12, ..., array_1n], ..., [array_m1, array_m2, ..., array_mn ]]

यदि आप ऊपर दिए गए कोड से प्रिंट (df) करते हैं तो यह आउटपुट है:

                       random_num                  sequential_num
0  [7, 9, 2, 2, 5, 3, 5, 3, 1, 4]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1  [8, 7, 9, 8, 1, 2, 2, 6, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2  [3, 4, 1, 2, 2, 1, 4, 2, 6, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3  [3, 1, 1, 1, 6, 2, 8, 6, 7, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4  [4, 2, 8, 5, 4, 1, 2, 2, 3, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5  [3, 2, 7, 4, 1, 5, 1, 4, 6, 3]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6  [5, 7, 3, 9, 7, 8, 4, 1, 3, 1]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7  [7, 4, 7, 6, 2, 6, 3, 2, 5, 6]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8  [3, 1, 6, 3, 2, 1, 5, 2, 2, 9]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9  [7, 2, 3, 9, 5, 5, 8, 6, 9, 8]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

उपरोक्त उदाहरण की अन्य भिन्नता:

b = [ (i,"text",[14, 5,], np.array([0,1,2,3,4,5,6,7,8,9]))  for i in 
range(0,10) ]
df = pd.DataFrame(data=b,columns=['Number','Text','2Elemnt_array','10Element_array'])

डीएफ का उत्पादन:

   Number  Text 2Elemnt_array                 10Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

यदि आप सरणियों के अन्य कॉलम जोड़ना चाहते हैं, तो:

df['3Element_array']=[([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3]),([1,2,3])]

डीएफ का अंतिम उत्पादन होगा:

   Number  Text 2Elemnt_array                 10Element_array 3Element_array
0       0  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
1       1  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
2       2  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
3       3  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
4       4  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
5       5  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
6       6  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
7       7  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
8       8  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]
9       9  text       [14, 5]  [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]      [1, 2, 3]

1

आप इसका उपयोग करके डेटाफ़्रेम से एक संख्यात्मक सरणी जोड़ और पुनः प्राप्त कर सकते हैं:

import numpy as np
import pandas as pd

df = pd.DataFrame({'b':range(10)}) # target dataframe
a = np.random.normal(size=(10,2)) # numpy array
df['a']=a.tolist() # save array
np.array(df['a'].tolist()) # retrieve array

यह पिछले जवाब पर बनाता है जो मुझे विरल भाग के कारण भ्रमित करता है और यह गैर-विरल सुकुमार एरेरे के लिए अच्छी तरह से काम करता है।


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