एक DataFrame में स्ट्रिंग्स, लेकिन dtype ऑब्जेक्ट है


96

पंडों ने मुझे क्यों बताया कि मेरे पास ऑब्जेक्ट हैं, हालांकि चयनित कॉलम में प्रत्येक आइटम एक स्ट्रिंग है - स्पष्ट रूपांतरण के बाद भी।

यह मेरा डेटाफ़्रेम है:

<class 'pandas.core.frame.DataFrame'>
Int64Index: 56992 entries, 0 to 56991
Data columns (total 7 columns):
id            56992  non-null values
attr1         56992  non-null values
attr2         56992  non-null values
attr3         56992  non-null values
attr4         56992  non-null values
attr5         56992  non-null values
attr6         56992  non-null values
dtypes: int64(2), object(5)

उनमें से पांच हैं dtype object। मैं स्पष्ट रूप से उन वस्तुओं को तार में परिवर्तित करता हूं:

for c in df.columns:
    if df[c].dtype == object:
        print "convert ", df[c].name, " to string"
        df[c] = df[c].astype(str)

फिर, df["attr2"]अभी भी है dtype object, हालांकि type(df["attr2"].ix[0]पता चलता है str, जो सही है।

के बीच पांडा अलग है int64और float64और object। जब नहीं है तो इसके पीछे क्या तर्क है dtype str? strद्वारा कवर क्यों किया जाता है object?


यहां आया क्योंकि 'ऑब्जेक्ट प्रकार' के कारण
जोड़

जवाबों:


145

Dtype ऑब्जेक्ट NumPy से आता है, यह एक ndarray में तत्व के प्रकार का वर्णन करता है। Ndarray के प्रत्येक तत्व का बाइट में समान आकार होना चाहिए। Int64 और float64 के लिए, वे 8 बाइट्स हैं। लेकिन तारों के लिए, स्ट्रिंग की लंबाई तय नहीं है। इसलिए सीधे ndarray में तारों के बाइट्स को बचाने के बजाय, पंडस ऑब्जेक्ट ndarray का उपयोग करते हैं, जो ऑब्जेक्ट्स को पॉइंटर्स को बचाते हैं, क्योंकि इस तरह के ndarray का dtype ऑब्जेक्ट है।

यहाँ एक उदाहरण है:

  • int64 सरणी में 4 int64 मान हैं।
  • ऑब्जेक्ट सरणी में 3 स्ट्रिंग ऑब्जेक्ट में 4 पॉइंटर्स होते हैं।

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


3
ध्यान दें कि 'ऑब्जेक्ट' टाइप कॉलम होने से डेटाफ्रेम पढ़ने / लिखने के संचालन पर एक बड़ा प्रभाव पड़ता है
जुलाब

क्या मैं डेटाटाइप को स्ट्रिंग के रूप में लौटा सकता हूं, किसी तरह। मुझे पता है कि मैं हमेशा टाइप (df ["कॉलम"] iloc [0]) का उपयोग कर सकता हूं, लेकिन ऐसा हो सकता है कि यह nan
user1953366

7

स्वीकृत उत्तर अच्छा है। बस एक उत्तर प्रदान करना चाहता था जिसने प्रलेखन को संदर्भित किया । प्रलेखन कहता है:

स्टिंग स्ट्रिंग्स के लिए पंडस ऑब्जेक्ट dtype का उपयोग करता है।

जैसा कि प्रमुख टिप्पणी कहती है, "इसके बारे में चिंता मत करो; यह ऐसा होना चाहिए।" (हालांकि स्वीकार किए गए उत्तर ने "क्यों" की व्याख्या करते हुए बहुत अच्छा काम किया; तार चर-लंबाई हैं)

लेकिन तारों के लिए, स्ट्रिंग की लंबाई तय नहीं है।


मुझे इसे स्वीकार करने के लिए हर कॉलम को पास करने की आवश्यकता है जिसे मैं स्काइप या स्केलेर अस्टाइप (str) में परिवर्तित करता हूं? लगता है मुझे शुरू में सभी कॉलमों पर लागू करने में सक्षम होना चाहिए।
टिंकिन 12

मुझे समझ नहीं आया; @ यदि आप स्तंभों को स्ट्रिंग में परिवर्तित नहीं करते हैं तो क्या होता है ? और यह उत्तर सभी स्तंभों को परिवर्तित करने के लिए एक सुंदर तरीका लगता है,astype(str) हालांकि मुझे अभी भी आश्चर्य होगा कि स्ट्रिंग रूपांतरण आवश्यक है
लाल मटर

मैं अपने डेटाफ़्रेम में सभी वस्तुओं (0) को नहीं रख सकता (1, नान) (1,0) के बजाय (
टिंकिन

क्षमा करें @Tincinc मुझे अभी भी समझ नहीं आया है; मैं मदद करना चाहता हूं, लेकिन आपका मुद्दा स्टैक ओवरफ्लो टिप्पणी की तुलना में अधिक जटिल लगता है। एक प्रश्न पूछने पर विचार करें, या मुझसे चैट में शामिल हों। (बस आपको आमंत्रित किया गया है)
लाल मटर

5

@ HYRY का जवाब बहुत अच्छा है। मैं बस थोड़ा और संदर्भ प्रदान करना चाहता हूं।

संग्रहीत डेटा को सन्निहित , निश्चित-आकार के मेमोरी ब्लॉक के रूप में संग्रहीत करता है । इन गुणों का एक साथ संयोजन वह है जो एरे को बिजली की पहुंच के लिए तीव्र गति से बनाता है। उदाहरण के लिए, पर विचार कैसे अपने कंप्यूटर 32-बिट पूर्णांक की एक सरणी संग्रहीत कर सकता है [3,0,1]

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

यदि आप अपने कंप्यूटर को सरणी में तीसरा तत्व लाने के लिए कहते हैं, तो यह शुरुआत में शुरू हो जाएगा और फिर 64 बिट में 3 तत्व तक पहुंचने के लिए कूदेंगे। यह जानने के बाद कि कितने बीट में कूदना है, जो तेजी से एरेज़ बनाता है

अब स्ट्रिंग्स के अनुक्रम पर विचार करें ['hello', 'i', 'am', 'a', 'banana']। स्ट्रिंग्स ऑब्जेक्ट्स होते हैं जो आकार में भिन्न होते हैं, इसलिए यदि आपने उन्हें सन्निहित मेमोरी ब्लॉकों में संग्रहीत करने की कोशिश की, तो यह इस तरह दिखना समाप्त हो जाएगा।

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

अब आपके कंप्यूटर में बेतरतीब ढंग से अनुरोध किए गए तत्व तक पहुंचने का एक तेज़ तरीका नहीं है। इस पर काबू पाने की कुंजी संकेत का उपयोग करना है। मूल रूप से, प्रत्येक स्ट्रिंग को कुछ यादृच्छिक मेमोरी स्थान में संग्रहीत करें, और प्रत्येक स्ट्रिंग के मेमोरी पते के साथ सरणी भरें। (मेमोरी एड्रेस अभी पूर्णांक हैं।) अब, चीजें इस तरह दिखती हैं

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

अब, यदि आप अपने कंप्यूटर को पहले की तरह ही 3 तत्व लाने के लिए कहते हैं, तो यह 64 बिट्स पर जा सकता है (यह मानते हुए कि मेमोरी एड्रेस 32-बिट पूर्णांक हैं) और फिर स्ट्रिंग लाने के लिए एक अतिरिक्त स्टेप करें।

NumPy के लिए चुनौती यह है कि वास्तव में स्ट्रिंगर्स की ओर इशारा करते हुए कोई गारंटी नहीं है। इसलिए यह dtype को 'ऑब्जेक्ट' के रूप में रिपोर्ट करता है।

बेशर्मी से अपने ब्लॉग लेख को प्लग इन करें जहां मैंने मूल रूप से इस पर चर्चा की।


अच्छी तरह से लिखा..धन्यवाद
tedd

1

संस्करण 1.0.0 (जनवरी 2020) के अनुसार, पांडा ने एक प्रयोगात्मक विशेषता के रूप में पेश किया है जो स्ट्रिंग प्रकारों के लिए प्रथम श्रेणी का समर्थन प्रदान करता है pandas.StringDtype

तुम अब भी देख रही हो जाएगा जबकि objectडिफ़ॉल्ट रूप से, नए प्रकार के एक निर्दिष्ट करने के द्वारा इस्तेमाल किया जा सकता dtypeका pd.StringDtypeया बस 'string':

>>> pd.Series(['abc', None, 'def'])
0     abc
1    None
2     def
dtype: object
>>> pd.Series(['abc', None, 'def'], dtype=pd.StringDtype())
0     abc
1    <NA>
2     def
dtype: string
>>> pd.Series(['abc', None, 'def']).astype('string')
0     abc
1    <NA>
2     def
dtype: string

2
यह प्रयोग न करें .... अभी तक। जैसा कि उन्होंने कहा, The implementation may change without warning.जिसका अर्थ है कि नए अपडेट आपके पुराने कार्यक्रमों को तोड़ देंगे।
नं

1
खैर, यह सब इस बात पर निर्भर करता है कि आप इसके लिए क्या उपयोग करने जा रहे हैं। यदि आप इसे एक उत्पादन प्रणाली में उपयोग करना चाहते हैं जहां निरंतर पैकेज अपग्रेड आवश्यक है, और जहां एपीआई टूटना एक अस्वीकार्य रखरखाव के बोझ का कारण बनता है, तो निश्चित रूप से, "प्रयोगात्मक" शब्द पर पूरा ध्यान दें, लेकिन यदि आप खोज करने के लिए पांडा का उपयोग कर रहे हैं उन लिपियों में विश्लेषण करना जिनके जीवन का समय कार्य दिवस नहीं बढ़ता है, तो उन चिंताओं का अर्थ आपके लिए कम होना चाहिए।
फुगेले

पंडों के 1.1 के अनुसार, एपीआई को स्थिर किया जा रहा है सभी dtypes को अब StringDtype में बदला जा सकता है
D3f0
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.