• 0

ربط عمودين نصيين من خلال Numpy

لدي إطار البيانات التالي:

>>> from pandas import *
>>> df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3]})
>>> df
  foo  bar
0   a    1
1   b    2
2   c    3

والآن أريد تحويله إلى التالي:

     bar
0    1 is a
1    2 is b
2    3 is c

حاولت أن أقوم بذلك من خلال Pands كالتالي:

df['foo'] = '%s is %s' % (df['bar'], df['foo'])

لكن الكود السابق يسبب لي مشكلة ويخرج متيجة مختلفة عما أريد:

>>> df
                                                 foo  bar
0  0    1\n1    2\n2    3\nName: bar, dtype: int6...    1
1  0    1\n1    2\n2    3\nName: bar, dtype: int6...    2
2  0    1\n1    2\n2    3\nName: bar, dtype: int6...    3

هل يمكن أن أستخدم Numpy لعمل هذا التغير؟ وكيف أقوم بذلك؟

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 1

المشكلة في التعليمات البرمجية الخاصة بك هي أنك تريد تطبيق العملية على كل صف. الطريقة التي كتبتها بها تأخذ عمودي "bar" و "foo" بالكامل ، وتحولها إلى سلاسل وتعطيك سلسلة واحدة . لذا يمكنك حل المشكلة بالشكل التالي:

from pandas import *
import numpy
df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3]})
df.apply(lambda x:'%s is %s' % (x['bar'],x['foo']),axis=1)

ومن خلال نمباي يمكنك القيام بذلك باستخدام الكلاس  numpy.chararray حيث نقوم بتحويل الأعمدة إلى تسلسل على هيئة chararrays، ثم نقوم بدمجهم معاً كالتالي:

from pandas import *
import numpy
d = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3]})
def join(d):
    a = numpy.char.array(d['bar'].values)
    b = numpy.char.array(d['foo'].values) 
    bar=(a + b' is ' + b).astype(str)
    return DataFrame({'bar':bar})
join(d)
"""
 	bar
0 	1 is a
1 	2 is b
2 	3 is c
"""
تمّ تعديل بواسطة Ali Haidar Ahmad
2 اشخاص أعجبوا بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

يمكنك ببساطة استخدام الكود الآتي

df['bar'] = df.bar.map(str) + " is " + df.foo.

أوصي باستخدام مكتبة pandas بدلاً من numpy هنا ، لأن استخدام مصفوفات numpy للنصوص عادةً ما يكون أكثر صعوبة مما يستحق. ، وما تريده واضح جدًا في pandas:

>>> from pandas import DataFrame
>>> df = DataFrame({'foo':['a','b','c'], 'bar':[1, 2, 3]})
>>> df
  foo  bar
0   a    1
1   b    2
2   c    3
>>> df["foo"] + " is " + df["bar"]
0    1 is a
1    2 is b
2    3 is c

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية
  • 0

المشكلة هي أن الأرقام في bar يتم إسناد datatype بصورة أتوماتيكية في بايثون و بالتالي تصبح القيم int64 و القيم في foo عبارة يتم إسناد النوع object (str) لها. و لاحظ أن إستخدام % يقوم بتعويض القيم من المتغير الأول في مكان %s و نفس الطريقة تنفذ في الثاني، لذلك نحصل على نتيجة مثل:

0    1\n1    2\n2    3\nName: bar, dtype: int64 is 0    a\n1    b\n2    c\nName: foo, dtype: object

يمكننا إستخدام عملية الدمج بين عمودين في dataframe بإستخدام + ولكن مع تحويل العمود الذي يحتوي على الأرقام إلى قيم نصية لنسهل عملية الدمج:

df["bar"].astype(str) + " is " + df["foo"]

والتي يكون خرجها:

0    1 is a
1    2 is b
2    3 is c
dtype: object

 

1 شخص أعجب بهذا

انشر على الشّبكات الاجتماعية


رابط هذه المساهمة
شارك على الشبكات الإجتماعية

يجب أن تكون عضوًا لدينا لتتمكّن من التعليق

انشاء حساب جديد

يستغرق التسجيل بضع ثوان فقط


سجّل حسابًا جديدًا

تسجيل الدخول

تملك حسابا مسجّلا بالفعل؟


سجّل دخولك الآن