একটি ডেটা ফ্রেমে স্ট্রিংগুলি, তবে dtype অবজেক্ট


101

পান্ডারা কেন আমাকে বলেন যে আমার কাছে বস্তু রয়েছে, যদিও নির্বাচিত কলামের প্রতিটি আইটেম একটি স্ট্রিং - স্পষ্ট রূপান্তর পরেও।

এটি আমার ডেটা ফ্রেম:

<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?


এখানে এসেছিলেন কারণ যোগদানের কারণে 'অবজেক্ট টাইপের' কারণে ব্যর্থ হচ্ছেন যদিও প্রতিটি "স্ট্রিং"
মনিকা হেডনেক

উত্তর:


149

Dtype অবজেক্ট NumPy থেকে আসে, এটি একটি নাদার্রে উপাদানটির ধরণ বর্ণনা করে। নাদারের প্রতিটি উপাদানের বাইটে একই আকার থাকতে হবে। Int64 এবং ভাসমান 64 এর জন্য এগুলি 8 বাইট। তবে স্ট্রিংগুলির জন্য, স্ট্রিংয়ের দৈর্ঘ্য নির্দিষ্ট করা হয় না। সুতরাং সরাসরি নদার্রে স্ট্রিংয়ের বাইটগুলি সংরক্ষণ করার পরিবর্তে পান্ডারা অবজেক্ট নাদার্রে ব্যবহার করেন, যা পয়েন্টারগুলিকে পয়েন্টারগুলিতে সংরক্ষণ করে, কারণ এই ধরণের ডাইপ্রেটি ন্যাডরাই অবজেক্ট।

এখানে একটি উদাহরণ:

  • ইন্টুআর অ্যারেতে 4 টি ইন 64 রয়েছে।
  • অবজেক্ট অ্যারেতে 4 টি পয়েন্টার থেকে 3 স্ট্রিং অবজেক্ট রয়েছে।

এখানে চিত্র বর্ণনা লিখুন


4
নোট তবে চেয়ে 'অবজেক্ট' টাইপ কলাম থাকার DataFrame কর্মক্ষমতা উপর উল্লেখযোগ্য প্রভাব রয়েছে পড়া / লেখা অপারেশন
erwanp

আমি কি ডেটাটাইপকে স্ট্রিং হিসাবে ফিরিয়ে আনতে পারি? আমি জানি আমি সবসময় টাইপ ব্যবহার করতে পারেন, কিন্তু এটা এত ঘটতে পারে এটি নান আছে (df প্রয়োগ [ "কলাম"] iloc [0]।)
user1953366

9

@ এইচআইআরওয়ির উত্তর দুর্দান্ত। আমি শুধু আরও কিছু প্রসঙ্গ সরবরাহ করতে চাই ..

অ্যারে সঞ্চয়ী , স্থির-আকারের মেমরি ব্লক হিসাবে ডেটা সঞ্চয় করে । এই বৈশিষ্ট্যগুলির একত্রে ডেটা অ্যাক্সেসের জন্য অ্যারে বাজকে দ্রুত তৈরি করে। উদাহরণস্বরূপ, আপনার কম্পিউটার কীভাবে 32-বিট পূর্ণসংখ্যার অ্যারে সঞ্চয় করতে পারে তা বিবেচনা করুন [3,0,1]

এখানে চিত্র বর্ণনা লিখুন

যদি আপনি আপনার কম্পিউটারকে অ্যারেতে তৃতীয় উপাদান আনতে বলেন তবে এটি শুরুতে শুরু হবে এবং তৃতীয় উপাদানটি পেতে 64৪ টি বিট পেরিয়ে যাবে। ঠিক কতগুলি বিট অতিক্রম করতে হবে তা জেনে যাওয়া কী অ্যারেগুলিকে দ্রুত করে তোলে

এখন স্ট্রিংয়ের ক্রম বিবেচনা করুন ['hello', 'i', 'am', 'a', 'banana']। স্ট্রিংগুলি এমন বস্তু যা আকারে পৃথক হয়, সুতরাং আপনি যদি এগুলি মেমরি ব্লকগুলিতে জমা করার চেষ্টা করে থাকেন তবে এটি দেখতে এটির মতো শেষ হবে।

এখানে চিত্র বর্ণনা লিখুন

এখন আপনার কম্পিউটারে এলোমেলোভাবে অনুরোধ করা উপাদানটি অ্যাক্সেস করার দ্রুত উপায় নেই। এটি কাটিয়ে উঠার মূল বিষয় হ'ল পয়েন্টার ব্যবহার করা। মূলত, প্রতিটি স্ট্রিং কিছু এলোমেলো মেমরি অবস্থানের মধ্যে সঞ্চয় করুন এবং প্রতিটি স্ট্রিংয়ের মেমরি ঠিকানা দিয়ে অ্যারে পূরণ করুন। (স্মৃতি ঠিকানাগুলি কেবল পূর্ণসংখ্যা হয়)) সুতরাং, এখন জিনিসগুলি দেখতে এ জাতীয়

এখানে চিত্র বর্ণনা লিখুন

এখন, আপনি যদি আগের কম্পিউটারের মতো আপনার কম্পিউটারকে তৃতীয় উপাদান আনতে বলেন তবে এটি 64৪ বিট ছাড়িয়ে যেতে পারে (ধরে নেওয়া মেমরির ঠিকানাগুলি 32-বিট ইন্টিজার) এবং তারপরে স্ট্রিংটি পেতে আরও একটি পদক্ষেপ নিতে পারে।

NumPy এর জন্য চ্যালেঞ্জ হ'ল পয়েন্টাররা আসলে স্ট্রিংগুলিতে নির্দেশ করছে তার কোনও গ্যারান্টি নেই। এজন্য এটি ডাইটিপকে 'অবজেক্ট' হিসাবে প্রতিবেদন করে।

নির্লজ্জভাবে আমার নিজের ব্লগ নিবন্ধটি প্লাগ করতে হবে যেখানে আমি মূলত এটি নিয়ে আলোচনা করেছি।


সুন্দরভাবে লেখা .. ধন্যবাদ

7

গৃহীত উত্তর ভাল। কেবল একটি উত্তর সরবরাহ করতে চেয়েছিল যা ডকুমেন্টেশনের রেফারেন্স দেয় । নথি বলছে:

পান্ডস স্ট্রিংগুলি স্ট্রোক করার জন্য অবজেক্টটি টাইপ ব্যবহার করে।

নেতৃস্থানীয় মন্তব্য যেমন বলে যে "এটি সম্পর্কে চিন্তা করবেন না; এটি এমন হওয়ার কথা।" (যদিও গৃহীত উত্তর "কেন" ব্যাখ্যা করার জন্য দুর্দান্ত কাজ করেছে; স্ট্রিংগুলি পরিবর্তনশীল-দৈর্ঘ্যের)

তবে স্ট্রিংগুলির জন্য, স্ট্রিংয়ের দৈর্ঘ্য নির্দিষ্ট করা হয় না।


আমি যে সমস্ত কলামটি পাস করেছি তা কেন এটি মেনে নেওয়ার জন্য আমাকে স্কিপি বা স্ক্লার্ন অ্যাস্টাইপ (স্ট্রাইট) এ রূপান্তর করতে হবে? দেখে মনে হচ্ছে প্রথম দিকে সমস্ত কলামে আমার এটি প্রয়োগ করা উচিত able
টিঙ্কিংক

আমি বুঝতে পারি না; @ টিঙ্কন আপনি যদি কলামগুলিকে স্ট্রিংয়ে রূপান্তর না করেন তবে কি হবে ? এবং এই উত্তরটি সমস্ত কলামগুলিকে রূপান্তর করার জন্য একটি দুর্দান্ত উপায় বলে মনে হচ্ছেastype(str) যদিও আমি এখনও আশ্চর্য হয়েছি স্ট্রিং রূপান্তরটি প্রয়োজনীয়
দ্য রেড মটর

আমি আমার ডেটাফ্রেমে থাকা সমস্ত বস্তু (0) এর পরিবর্তে (1, নান) ক্যান্ট করতে পারি না
টিঙ্কিংক

দুঃখিত @ টিঙ্কিংক আমি এখনও বুঝতে পারি না; আমি সহায়তা করতে চাই, তবে আপনার সমস্যাটি স্ট্যাক ওভারফ্লো মন্তব্যটির চেয়ে জটিল বলে মনে হচ্ছে। একটি প্রশ্ন জিজ্ঞাসা করুন, বা চ্যাটে আমাকে যোগদান বিবেচনা করুন। (সবেমাত্র আপনাকে আমন্ত্রণ জানিয়েছে)
দ্য রেড মটর

2

সংস্করণ 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

4
এটি ব্যবহার করবেন না .... এখনও। যেমন তারা বলেছে, The implementation may change without warning.যার অর্থ নতুন আপডেটগুলি আপনার পুরানো প্রোগ্রামগুলিকে ভেঙে দেবে।
NoName

4
ঠিক আছে, এটি সমস্ত কিসের জন্য আপনি এটি ব্যবহার করতে যাচ্ছেন তার উপর নির্ভর করে। আপনি যদি এমন একটি উত্পাদন ব্যবস্থায় এটি ব্যবহার করতে চান যেখানে অবিচ্ছিন্ন প্যাকেজ আপগ্রেডগুলি প্রয়োজনীয় এবং যেখানে API বিরতি কোনও অগ্রহণযোগ্য রক্ষণাবেক্ষণ বোঝা সৃষ্টি করে, তবে অবশ্যই, "পরীক্ষামূলক" শব্দটির দিকে গভীর মনোযোগ দিন, তবে আপনি যদি অনুসন্ধানের জন্য প্যান্ডাস ব্যবহার করছেন তবে স্ক্রিপ্টগুলিতে বিশ্লেষণ করে যার জীবনকাল কোনও কাজের দিন বাড়ায় না, তবে এই উদ্বেগগুলি আপনার কাছে সামান্যই হওয়া উচিত।
fuglede

4
পান্ডাস ১.১ হিসাবে, API টি স্থিতিশীল বলে মনে হচ্ছে সমস্ত টাইপগুলি এখন স্ট্রিংডটাইপে রূপান্তর করতে পারে
D3f0
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.