اذهب إلى المحتوى

السؤال

نشر

السلام عليكم

هو فيه فرق مابين ال object و بين الStr في باثيون ؟

عشان ان فيه الكود ده عاوز بس العمود ان يكون نوع Str  هو بس اليتغير ؟

encoder = LabelEncoder()

for columns in data_train.columns:
    if data_train[columns].dtypes == object:
        data_train[columns] = encoder.fit_transform(data_train[columns])

فا اي الفرق مايبن كده وكده

encoder = LabelEncoder()

for columns in data_train.columns:
    if data_train[columns].dtypes == str:
        data_train[columns] = encoder.fit_transform(data_train[columns])

 

Recommended Posts

  • 0
نشر

هناك فرق كبير بين object و str في بايثون، خاصةً عند التعامل مع مكتبة Pandas وذلك الفرق هو السبب في أن الكود الأول يعمل بشكل صحيح بينما الكود الثاني لا يعمل كما تتوقع.

بمعنى عند قراءة بيانات من ملف (مثل CSV أو Excel) باستخدام Pandas، فإن الأعمدة التي تحتوي على strings أو بيانات مختلطة مثل أرقام ونصوص يتم تخزينها بنوع بيانات object بشكل إفتراضي.

ولكن نوع البيانات Object له نطاق أوسع بكثير. فهو لا يشمل فقط النصوص، بل يمكن أن يشمل أيضًا أي بيانات أخرى لا تفهمها Pandas.

وobject هو نوع بيانات عام في Pandas يمكن أن يحمل أي نوع من البيانات في بايثون، ولكنه يستخدم بشكل أساسي لتمثيل النصوص، والأهم ليس كل عمود من نوع object هو بالضرورة عمود نصي string، فقد يحتوي على أنواع بيانات أخرى مختلطة.

بعد Pandas 1.0، أصبح هناك نوع بيانات مخصص للتعامل مع بيانات النصوص والعمل بها، وهو StringDtype، بالتالي في حال نوع العمود Object، فلا يعني بالضرورة أن جميع القيم ستكون نصية، في الواقع، يمكن أن تكون جميعها أرقامًا، أو مزيجًا من النصوص والأعداد الصحيحة والأعداد العشرية.

إذن مع وجود ذلك التباين، فلا تستطيع إجراء أي عملية نصية على العمود مباشرة.

عامًة str هو نوع بيانات أساسي في بايثون يمثل سلسلة من الحروف (نص)، بالتالي في حال data_train[columns].dtypes == str، فإنك تسأل Pandas هل نوع البيانات في العمود هو تحديدًا str، وهو ليس ما يحدث عند قراءة البيانات من ملف.

بينما الشرط if data_train[columns].dtypes == object  سيتم تنفيذه في حال نوع العمو هو object، بغض النظر عن نوع البيانات التي يحتويها. 

لذا، بإمكانك استخراج ومعالجة النصوص فقط داخل الأعمدة عن طريق إخبار Pandas بشكل صريح أن نوع البيانات هو 'String' وليس 'Object'.

ستجد تفصيل هنا:

  • 0
نشر
بتاريخ 22 دقائق مضت قال Mustafa Suleiman:

هناك فرق كبير بين object و str كأنواع بيانات في بايثون، خاصةً عند التعامل مع مكتبة Pandas وذلك الفرق هو السبب في أن الكود الأول يعمل بشكل صحيح بينما الكود الثاني لا يعمل كما تتوقع.

 

ايوه صح فعلان

بتاريخ 22 دقائق مضت قال Mustafa Suleiman:

هناك فرق كبير بين object و str في بايثون، خاصةً عند التعامل مع مكتبة Pandas وذلك الفرق هو السبب في أن الكود الأول يعمل بشكل صحيح بينما الكود الثاني لا يعمل كما تتوقع.

بمعنى عند قراءة بيانات من ملف (مثل CSV أو Excel) باستخدام Pandas، فإن الأعمدة التي تحتوي على strings أو بيانات مختلطة مثل أرقام ونصوص يتم تخزينها بنوع بيانات object بشكل إفتراضي.

ولكن نوع البيانات Object له نطاق أوسع بكثير. فهو لا يشمل فقط النصوص، بل يمكن أن يشمل أيضًا أي بيانات أخرى لا تفهمها Pandas.

وobject هو نوع بيانات عام في Pandas يمكن أن يحمل أي نوع من البيانات في بايثون، ولكنه يستخدم بشكل أساسي لتمثيل النصوص، والأهم ليس كل عمود من نوع object هو بالضرورة عمود نصي string، فقد يحتوي على أنواع بيانات أخرى مختلطة.

بعد Pandas 1.0، أصبح هناك نوع بيانات مخصص للتعامل مع بيانات النصوص والعمل بها، وهو StringDtype، بالتالي في حال نوع العمود Object، فلا يعني بالضرورة أن جميع القيم ستكون نصية، في الواقع، يمكن أن تكون جميعها أرقامًا، أو مزيجًا من النصوص والأعداد الصحيحة والأعداد العشرية.

إذن مع وجود ذلك التباين، فلا تستطيع إجراء أي عملية نصية على العمود مباشرة.

عامًة str هو نوع بيانات أساسي في بايثون يمثل سلسلة من الحروف (نص)، بالتالي في حال data_train[columns].dtypes == str، فإنك تسأل Pandas هل نوع البيانات في العمود هو تحديدًا str، وهو ليس ما يحدث عند قراءة البيانات من ملف.

بينما الشرط if data_train[columns].dtypes == object  سيتم تنفيذه في حال نوع العمو هو object، بغض النظر عن نوع البيانات التي يحتويها. 

لذا، بإمكانك استخراج ومعالجة النصوص فقط داخل الأعمدة عن طريق إخبار Pandas بشكل صريح أن نوع البيانات هو 'String' وليس 'Object'.

ستجد تفصيل هنا:

الف شكراا جدا لحضرتك يا أ.مصطفي 

جزاك الله كل خير

  • 0
نشر

وعليكم السلام ورحمة الله وبركاته.

في بايثون لا يوجد نوع بيانات يسمى object بل هو نوع خاص فقط بمكتبة pandas . أما في بايثون يسمى قاموس dict :

أما في مكتبة pandas فإن نوع البيانات object هو النوع الافتراضي للأعمدة و الذي يستخدم لتخزين القيم النصية (strings) أو أي بيانات أخرى غير رقمية مثل التواريخ والقوائم وغيرها .

أى الأعمدة التي تحتوي قيما غير عددية سيكون نوعها object مهما كانت القيم و لاجظ القيم التالية جميعها يتم إعتبارها ك object في pandas :

# سلاسل نصية عادية
data = {'col': ['ahmed', 'mohamed', 'amr']}

# قوائم lists
data = {'col': [[1, 2], [3, 4], [5, 6]]}

# قيم مختلطة تعتبر object
data = {'col': ['ahmed', 123, [1, 2, 3]]}

ولذلك فإن الكود الثاني الخاص ب data_train[columns].dtypes == str لن يعمل لأن النوع الإفتراضي كما وضحت لك هو object مهما كانت القيم التي بداخله. أما الكود الأول الخاص ب data_train[columns].dtypes == object فسيتم تنفيذه دائما حتي لو لم تكن البيانات بداخل العمود من نوع str في بايثون

ولكن لو أردت فقط تنفيذ كود معين على عمود يحتوي قيم نصية فقط يمكنك إستخدام التالي :

encoder = LabelEncoder()

for columns in data_train.columns:
  is_string = data_train[columns].apply(lambda x: isinstance(x, str)).all()  
  if is_string:
    data_train[columns] = encoder.fit_transform(data_train[columns])

هنا إستخدمنا apply للتطبيق على العمود وإستخدمنا isinstance للتحقق من القيمة على أنها str وليست اى نوع بيانات أخر في بايثون وبهذا فإن is_string ستحوي قيمة True إذا كانت جميع البيانات في العمود من نوع str في بايثون

  • 0
نشر

الفرق الرئيسي بين object و str يكمن في أن object هو نوع بيانات عام في Pandas يستخدم لتخزين النصوص أو بيانات مختلطة (مثل أرقام ونصوص معا)، بينما str هو نوع بيانات مخصص للنصوص في Python أي عند قراءة بيانات باستخدام Pandas، يتم تخزين الأعمدة النصية ك object افتراضيا لذلك  نجد الشرط التالي if data_train[columns].dtypes == object يعمل لأنه يتحقق من نوع العمود في Pandas، بينما if data_train[columns].dtypes == str لا يعمل لأن النصوص ليست من نوع str في Pandas بشكل افتراضي.

  • 0
نشر
بتاريخ 12 ساعة قال محمد عاطف17:

وعليكم السلام ورحمة الله وبركاته.

في بايثون لا يوجد نوع بيانات يسمى object بل هو نوع خاص فقط بمكتبة pandas . أما في بايثون يسمى قاموس dict :

أما في مكتبة pandas فإن نوع البيانات object هو النوع الافتراضي للأعمدة و الذي يستخدم لتخزين القيم النصية (strings) أو أي بيانات أخرى غير رقمية مثل التواريخ والقوائم وغيرها .

أى الأعمدة التي تحتوي قيما غير عددية سيكون نوعها object مهما كانت القيم و لاجظ القيم التالية جميعها يتم إعتبارها ك object في pandas :

# سلاسل نصية عادية
data = {'col': ['ahmed', 'mohamed', 'amr']}

# قوائم lists
data = {'col': [[1, 2], [3, 4], [5, 6]]}

# قيم مختلطة تعتبر object
data = {'col': ['ahmed', 123, [1, 2, 3]]}

ولذلك فإن الكود الثاني الخاص ب data_train[columns].dtypes == str لن يعمل لأن النوع الإفتراضي كما وضحت لك هو object مهما كانت القيم التي بداخله. أما الكود الأول الخاص ب data_train[columns].dtypes == object فسيتم تنفيذه دائما حتي لو لم تكن البيانات بداخل العمود من نوع str في بايثون

ولكن لو أردت فقط تنفيذ كود معين على عمود يحتوي قيم نصية فقط يمكنك إستخدام التالي :

encoder = LabelEncoder()

for columns in data_train.columns:
  is_string = data_train[columns].apply(lambda x: isinstance(x, str)).all()  
  if is_string:
    data_train[columns] = encoder.fit_transform(data_train[columns])

هنا إستخدمنا apply للتطبيق على العمود وإستخدمنا isinstance للتحقق من القيمة على أنها str وليست اى نوع بيانات أخر في بايثون وبهذا فإن is_string ستحوي قيمة True إذا كانت جميع البيانات في العمود من نوع str في بايثون

الف شكراا لحضرتك جدا 

جزاك الله كل خير

 

بتاريخ 12 ساعة قال عبد الوهاب بومعراف:

الفرق الرئيسي بين object و str يكمن في أن object هو نوع بيانات عام في Pandas يستخدم لتخزين النصوص أو بيانات مختلطة (مثل أرقام ونصوص معا)، بينما str هو نوع بيانات مخصص للنصوص في Python أي عند قراءة بيانات باستخدام Pandas، يتم تخزين الأعمدة النصية ك object افتراضيا لذلك  نجد الشرط التالي if data_train[columns].dtypes == object يعمل لأنه يتحقق من نوع العمود في Pandas، بينما if data_train[columns].dtypes == str لا يعمل لأن النصوص ليست من نوع str في Pandas بشكل افتراضي.

الف شكراا لحضرتك جدا 

بتاريخ 12 ساعة قال Ali Ahmed55:
    if data_train[columns].dtypes == object:

بس سوال هل الازم اصلان ان اعمل الشرط ده يعني هيحصل اي لو معملتيش كده ؟

  • 0
نشر
بتاريخ 42 دقائق مضت قال Ali Ahmed55:

الف شكراا لحضرتك جدا 

جزاك الله كل خير

 

الف شكراا لحضرتك جدا 

بس سوال هل الازم اصلان ان اعمل الشرط ده يعني هيحصل اي لو معملتيش كده ؟

الشرط يضمن أنك تطبق LabelEncoder فقط على الأعمدة النصية (object) دون التأثير على الأعمدة الرقمية. بدون الشرط، قد يتم تعديل الأعمدة الرقمية بشكل غير مقصود، مما يفسد البيانات.

  • 0
نشر
بتاريخ 15 دقائق مضت قال عبد الوهاب بومعراف:

الشرط يضمن أنك تطبق LabelEncoder فقط على الأعمدة النصية (object) دون التأثير على الأعمدة الرقمية. بدون الشرط، قد يتم تعديل الأعمدة الرقمية بشكل غير مقصود، مما يفسد البيانات.

تمام جدا 

الف شكراا لحضرتك

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...