मैं एक पांडा श्रृंखला या सूचकांक को एक Numpy सरणी में कैसे परिवर्तित करूं?


264

क्या आप जानते हैं कि एक DataFrame के सूचकांक या स्तंभ को एक NumPy सरणी या अजगर सूची के रूप में कैसे प्राप्त करें?


इसके अलावा, संबंधित: पंडों
डेटाफ्रेम


1
नोट: पंडों DataFrame को एक सरणी (या सूची) में बदलना जैसे कि अन्य मुद्दों का संकेत हो सकता है। मैं दृढ़ता से यह सुनिश्चित करने की सलाह देता हूं कि एक DataFrame आपके विशेष उपयोग के मामले के लिए उपयुक्त डेटा संरचना है, और यह कि पंडों को आपकी रुचि के कार्यों को निष्पादित करने का कोई तरीका शामिल नहीं है।
AMC

जवाबों:


353

NumPy सरणी प्राप्त करने के लिए, आपको valuesविशेषता का उपयोग करना चाहिए :

In [1]: df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]}, index=['a', 'b', 'c']); df
   A  B
a  1  4
b  2  5
c  3  6

In [2]: df.index.values
Out[2]: array(['a', 'b', 'c'], dtype=object)

यह एक्सेस करता है कि डेटा पहले से कैसे संग्रहीत है, इसलिए रूपांतरण की कोई आवश्यकता नहीं है।
नोट: यह विशेषता कई अन्य पांडा की वस्तुओं के लिए भी उपलब्ध है।

In [3]: df['A'].values
Out[3]: Out[16]: array([1, 2, 3])

सूची के रूप में सूचकांक प्राप्त करने के लिए, कॉल करें tolist:

In [4]: df.index.tolist()
Out[4]: ['a', 'b', 'c']

और इसी तरह, कॉलम के लिए।


नोट: .valuesहटाई गई है, .to_numpy()द्वारा सुझाए गए प्रतिस्थापन यदि आप एक NumPy सरणी चाहते हैं। क्या आप इस पर विस्तार कर सकते हैं कि डेटा पहले से कैसे संग्रहीत है, इसलिए रूपांतरण की कोई आवश्यकता नहीं है ?
एएमसी

Cs95 से जवाब का एक बड़ा स्पष्टीकरण देता है .values, .to_numpy()और .array
AMC

75

आप df.indexअनुक्रमणिका ऑब्जेक्ट का उपयोग करने के लिए उपयोग कर सकते हैं और फिर उपयोग करने वाली सूची में मान प्राप्त कर सकते हैं df.index.tolist()। इसी तरह, आप df['col'].tolist()सीरीज के लिए उपयोग कर सकते हैं ।


यह उदाहरण देता हैमैथोड और नहीं सूची सरणी
वी श्रेयस

12
@VShreyas, कैसे के बारे मेंdf.index.values.tolist()
LancelotHolmes

3
df.index.tolist()एक इंस्टेंस विधि वापस नहीं करता है। यह सूचकांकों की सूची देता है। यह पांडा इंडेक्स पर परिभाषित एक विधि है। मूल्यों को बुलाते समय पहले एक संभावना है, नौकरी को सुन्न करने के लिए सौंपना एक सुधार नहीं है - बस एक विकल्प।
अहान

51

पांडा> = 0.24

अपने उपयोग को सीमित करें .valuesइन विधियों के पक्ष में !

V0.24.0 के बाद से, हम दो ब्रांड अनूठे नए, से NumPy सरणी प्राप्त करने के लिए पसंदीदा तरीकों होगा Index, Seriesऔर DataFrameवस्तुओं: वे कर रहे हैं to_numpy(), और .array। उपयोग के संबंध में, डॉक्स का उल्लेख है:

हम को नहीं निकाला या पदावनत Series.valuesया DataFrame.valuesहै, लेकिन हम अनुशंसा करते हैं और का उपयोग कर .arrayया .to_numpy()बजाय।

अधिक जानकारी के लिए v0.24.0 रिलीज़ नोट्स का यह अनुभाग देखें ।


to_numpy() तरीका

df.index.to_numpy()
# array(['a', 'b'], dtype=object)

df['A'].to_numpy()
#  array([1, 4])

डिफ़ॉल्ट रूप से, एक दृश्य लौटाया जाता है। किए गए कोई भी संशोधन मूल को प्रभावित करेगा।

v = df.index.to_numpy()
v[0] = -1

df
    A  B
-1  1  2
b   4  5

यदि आपको इसके बजाय प्रतिलिपि की आवश्यकता है, तो उपयोग करें to_numpy(copy=True);

v = df.index.to_numpy(copy=True)
v[-1] = -123

df
   A  B
a  1  2
b  4  5

ध्यान दें कि यह फ़ंक्शन डेटाफ्रेम (जबकि .arrayनहीं) के लिए भी काम करता है।


arrayगुण
यह विशेषता रिटर्न एकExtensionArrayउद्देश्य यह है कि पीठ सूचकांक / श्रृंखला।

pd.__version__
# '0.24.0rc1'

# Setup.
df = pd.DataFrame([[1, 2], [4, 5]], columns=['A', 'B'], index=['a', 'b'])
df

   A  B
a  1  2
b  4  5

df.index.array    
# <PandasArray>
# ['a', 'b']
# Length: 2, dtype: object

df['A'].array
# <PandasArray>
# [1, 4]
# Length: 2, dtype: int64

यहां से, एक सूची का उपयोग करना संभव है list:

list(df.index.array)
# ['a', 'b']

list(df['A'].array)
# [1, 4]

या, सीधे कॉल करें .tolist():

df.index.tolist()
# ['a', 'b']

df['A'].tolist()
# [1, 4]

क्या लौटा है, इस बारे में डॉक्स उल्लेख करते हैं,

के लिए Seriesऔर Indexसामान्य NumPy सरणी द्वारा समर्थित es, Series.array एक नया वापस आ जाएगी arrays.PandasArray, जो एक पतली (कोई-प्रतिलिपि) एक के आसपास आवरण है numpy.ndarrayarrays.PandasArrayविशेष रूप से अपने आप में उपयोगी नहीं है, लेकिन यह पंडों में या किसी तीसरे पक्ष के पुस्तकालय द्वारा परिभाषित किसी भी विस्तार सरणी के समान इंटरफ़ेस प्रदान करता है।

इसलिए, संक्षेप में, .arrayया तो वापस आ जाएगा

  1. ExtensionArrayसूचकांक / श्रृंखला, या के मौजूदा समर्थन
  2. यदि श्रृंखला में एक नुमाइशी सरणी होती है, ExtensionArrayतो अंतर्निहित सरणी पर एक पतली आवरण के रूप में एक नई वस्तु बनाई जाती है।

दो नए तरीकों को जोड़ने के लिए तर्क
ये कार्य दो GitHub मुद्दों GH19954 और GH23623 के तहत चर्चा के परिणामस्वरूप जोड़े गए थे ।

विशेष रूप से, डॉक्स औचित्य का उल्लेख करते हैं:

[...] इसके साथ .valuesयह स्पष्ट नहीं था कि लौटाया गया मान वास्तविक सरणी होगा, इसका कोई परिवर्तन होगा, या पांडा कस्टम सरणियों (जैसे Categorical) में से एक होगा। उदाहरण के लिए, के साथ PeriodIndex, .values एक नया उत्पन्न करता है ndarrayअवधि के लिए हर बार वस्तुओं। [...]

इन दोनों कार्यों का उद्देश्य एपीआई की स्थिरता में सुधार करना है, जो सही दिशा में एक बड़ा कदम है।

अंत में, .valuesवर्तमान संस्करण में पदावनत नहीं किया जाएगा, लेकिन मुझे उम्मीद है कि यह भविष्य में किसी बिंदु पर हो सकता है, इसलिए मैं उपयोगकर्ताओं से आग्रह करूंगा कि जैसे ही आप कर सकते हैं, नए एपीआई की ओर पलायन करें।


48

यदि आप एक मल्टी-इंडेक्स डेटाफ्रेम के साथ काम कर रहे हैं, तो आप मल्टी-इंडेक्स के केवल एक नाम के कॉलम को निकालने में दिलचस्पी ले सकते हैं। आप ऐसा कर सकते हैं

df.index.get_level_values('name_sub_index')

और निश्चित रूप name_sub_indexसे एक तत्व होना चाहिएFrozenList df.index.names


16

पांडा v0.13 के बाद से आप भी उपयोग कर सकते हैं get_values:

df.index.get_values()

5
क्या इस और .values ​​के बीच अंतर है? (मैंने संस्करण जानकारी अपडेट की, क्योंकि यह फ़ंक्शन 0.13.0 डॉक्स से प्रकट होता है।)
एंडी हेडन

@Andy हेडन: एक अंतर नहीं है कि .get_values ​​केवल वर्तमान मान प्राप्त करने का आधिकारिक तरीका है। जबकि (। बहु-सूचकांक पर) सूचकांक मान लौटा सकते हैं जिसके लिए पंक्तियों या स्तंभों को हटा दिया गया है?
ईजेकील क्रुगलिक

@EzekielKruglick तो यह हमेशा एक प्रति है? प्रलेखन से जुड़ा हुआ बहुत हल्का है, मैंने नहीं सोचा था कि आपको इस तरह से भी डुप्लिकेट मिलता है (भले ही वे एमआई में हों। वे ऐसे नहीं होंगे।) एक उदाहरण देखने के लिए बहुत अच्छा होगा जो इसे प्रदर्शित करता है!
एंडी हेडन

@AndyHayden: मुझे लगता है कि मैं आपकी टिप्पणी गलत पढ़ रहा था। आप सही कह रहे हैं, .values ​​अच्छा है, .level पुराना हो गया है और get_values ​​आपको मौजूदा मानों को गिराई गई पंक्तियों / कॉल को छोड़कर ठीक से देता है। मूल github मुद्दा: github.com/pydata/pandas/issues/3686 लेकिन मैंने अभी-अभी जाँच की है और ऐसा लगता है कि .values ​​(निश्चित रूप से!) आज तक की जानकारी से भिन्न रूप में तारीख की जानकारी देता है, जैसा कि हम सोच रहे थे
ईजेकील क्रुगलिक

1
@AndyHayden नहीं, कोई अंतर नहीं है। get_valuesबस फोन करता है .values। यह टाइप करने के लिए अधिक वर्ण है।
सीएस 95 95

0

मैंने पांडा dataframeको बदल दिया listऔर फिर मूल का उपयोग किया list.index()। कुछ इस तरह:

dd = list(zone[0]) #Where zone[0] is some specific column of the table
idx = dd.index(filename[i])

आप के रूप में आप सूचकांक मूल्य है idx


और फिर मूल सूची का उपयोग किया ।index () यह कैसे एक श्रृंखला को एक सूची में बदलने के सवाल से संबंधित है?
एएमसी

0

ऐसा करने का एक और हालिया तरीका .to_numpy () फ़ंक्शन का उपयोग करना है।

यदि मेरे पास स्तंभ 'मूल्य' के साथ डेटाफ़्रेम है, तो मैं इसे निम्नानुसार परिवर्तित कर सकता हूं:

priceArray = df['price'].to_numpy()

आप फ़ंक्शन के तर्क के रूप में डेटा प्रकार, जैसे फ्लोट या ऑब्जेक्ट भी पास कर सकते हैं


-1

नीचे डेटाफ्रेम कॉलम को सुपीरियर एरे में बदलने का एक सरल तरीका है।

df = pd.DataFrame(somedict) 
ytrain = df['label']
ytrain_numpy = np.array([x for x in ytrain['label']])

ytrain_numpy एक सुव्यवस्थित सरणी है।

मैंने to.numpy()इसके साथ प्रयास किया, लेकिन इसने मुझे नीचे की त्रुटि दी: TypeError: प्रकारों के लिए कोई समर्थित रूपांतरण नहीं: (dtype ('O'),) रैखिक SVC का उपयोग करते हुए बाइनरी रीलेवेंस क्लासफिकेशन करते हुए। .numpy () डेटाफ्रेम को संख्यात्मक सरणी में परिवर्तित कर रहा था लेकिन आंतरिक तत्व के डेटा प्रकार की सूची थी जिसके कारण उपरोक्त त्रुटि देखी गई थी।


मैंने to.numpy () के साथ प्रयास किया, लेकिन इसने मुझे निम्न त्रुटि दी: TypeError: प्रकारों के लिए कोई समर्थित रूपांतरण नहीं: (dtype ('O'),) रैखिक एसवीसी का उपयोग करते हुए बाइनरी रीलेवेंस क्लासफिकेशन करते हुए। .numpy () डेटाफ्रेम को संख्यात्मक सरणी में परिवर्तित कर रहा था लेकिन आंतरिक तत्व के डेटा प्रकार की सूची थी जिसके कारण उपरोक्त त्रुटि देखी गई थी। हालांकि यह वास्तव में गलती नहीं है to_numpy
एएमसी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.