एक Numpy सरणी से एक पंडास DataFrame बनाना: मैं इंडेक्स कॉलम और कॉलम हेडर कैसे निर्दिष्ट करूं?


281

मेरे पास एक Numpy सरणी है जिसमें सूचियों की सूची शामिल है, पंक्ति लेबल और स्तंभ नामों के साथ दो-आयामी सरणी का प्रतिनिधित्व नीचे दिखाए अनुसार:

data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]])

मैं परिणामी DataFrame को अनुक्रम मान के रूप में Row1 और Row2, और Col1, Col2 को हेडर मानों के रूप में लेना चाहूंगा

मैं सूचकांक को निम्नानुसार निर्दिष्ट कर सकता हूं:

df = pd.DataFrame(data,index=data[:,0]),

हालांकि मैं अनिश्चित हूं कि कॉलम हेडर को सबसे अच्छा कैसे असाइन किया जाए।


3
@ behzad.nouri का उत्तर सही है, लेकिन मुझे लगता है कि आपको इस पर विचार करना चाहिए कि क्या आपके पास दूसरे रूप में प्रारंभिक डेटा नहीं हो सकता है। क्योंकि अब, आपके मूल्य स्ट्रिंग्स होंगे न कि इन्ट्स (क्योंकि इन्ट्री अरेंज मिक्सिंग इनट्स और स्ट्रिंग्स के कारण, इसलिए सभी को स्ट्रिंग के लिए डाला जाता है क्योंकि सुपीरियर एरोज को सजातीय होना होता है)।
जॉरिस डेस

जवाबों:


315

आप निर्दिष्ट करने की आवश्यकता data, indexऔर columnsकरने के लिए DataFrameके रूप में, निर्माता:

>>> pd.DataFrame(data=data[1:,1:],    # values
...              index=data[1:,0],    # 1st column as index
...              columns=data[0,1:])  # 1st row as the column names

संपादित करें : जैसे @joris टिप्पणी में, आपको np.int_(data[1:,1:])सही डेटा प्रकार रखने के लिए ऊपर बदलना पड़ सकता है ।


7
यह काम करता है - लेकिन इनपुट डेटा की आम संरचना और वांछित अनुप्रयोग के लिए DataFrameक्या कोई "शॉर्टकट" नहीं है? यह मूल रूप से ऐसा तरीका है जो csvs लोड किया गया है - और कई सीएसवी पाठकों के लिए डिफ़ॉल्ट हैंडलिंग द्वारा प्रबंधित किया जा सकता है। डीएफ के लिए एक अनुरूप संरचना उपयोगी होगी।
जवदाबा

मैंने पूरक उत्तर के रूप में इसके लिए एक मिनी सहायक / सुविधा पद्धति जोड़ी।
जावदबा

93

यहां समाधान को समझना आसान है

import numpy as np
import pandas as pd

# Creating a 2 dimensional numpy array
>>> data = np.array([[5.8, 2.8], [6.0, 2.2]])
>>> print(data)
>>> data
array([[5.8, 2.8],
       [6. , 2.2]])

# Creating pandas dataframe from numpy array
>>> dataset = pd.DataFrame({'Column1': data[:, 0], 'Column2': data[:, 1]})
>>> print(dataset)
   Column1  Column2
0      5.8      2.8
1      6.0      2.2

20
लेकिन आपको Seriesनामों को मैन्युअल रूप से निर्दिष्ट करना था .. जो कि स्केलेबल नहीं है।
जवदाबा

24

मैं जोरिस से सहमत हूं; ऐसा लगता है कि आपको यह अलग तरह से करना चाहिए, जैसे कि सुन्न रिकॉर्ड सरणियों के साथइस महान जवाब से "विकल्प 2" को संशोधित करना , आप इसे इस तरह कर सकते हैं:

import pandas
import numpy

dtype = [('Col1','int32'), ('Col2','float32'), ('Col3','float32')]
values = numpy.zeros(20, dtype=dtype)
index = ['Row'+str(i) for i in range(1, len(values)+1)]

df = pandas.DataFrame(values, index=index)

13

यह केवल पंडों DataFrame के_कोर्स का उपयोग करके किया जा सकता है

import numpy as np
import pandas as pd
# Creating a numpy array
x = np.arange(1,10,1).reshape(-1,1)
dataframe = pd.DataFrame.from_records(x)

यह उत्तर प्रश्न में दिए गए उदाहरण डेटा के साथ काम नहीं करता है, अर्थात data = array([['','Col1','Col2'],['Row1',1,2],['Row2',3,4]])
JPP

सबसे सरल सामान्य समाधान जब हमने लेबल निर्दिष्ट नहीं किया है।
सेरेब्रो

12
    >>import pandas as pd
    >>import numpy as np
    >>data.shape
    (480,193)
    >>type(data)
    numpy.ndarray
    >>df=pd.DataFrame(data=data[0:,0:],
    ...        index=[i for i in range(data.shape[0])],
    ...        columns=['f'+str(i) for i in range(data.shape[1])])
    >>df.head()
    [![array to dataframe][1]][1]

यहां छवि विवरण दर्ज करें


8

@ Behzad.nouri के उत्तर में जोड़ना - हम इस सामान्य परिदृश्य को संभालने के लिए एक सहायक दिनचर्या बना सकते हैं:

def csvDf(dat,**kwargs): 
  from numpy import array
  data = array(dat)
  if data is None or len(data)==0 or len(data[0])==0:
    return None
  else:
    return pd.DataFrame(data[1:,1:],index=data[1:,0],columns=data[0,1:],**kwargs)

आइये इसे आजमाते हैं:

data = [['','a','b','c'],['row1','row1cola','row1colb','row1colc'],
     ['row2','row2cola','row2colb','row2colc'],['row3','row3cola','row3colb','row3colc']]
csvDf(data)

In [61]: csvDf(data)
Out[61]:
             a         b         c
row1  row1cola  row1colb  row1colc
row2  row2cola  row2colb  row2colc
row3  row3cola  row3colb  row3colc
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.