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

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

Fahmy Mostafa

السؤال

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

>>> 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 لعمل هذا التغير؟ وكيف أقوم بذلك؟

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

Recommended Posts

  • 2

المشكلة في التعليمات البرمجية الخاصة بك هي أنك تريد تطبيق العملية على كل صف. الطريقة التي كتبتها بها تأخذ عمودي "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
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 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

 

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

  • 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

 

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

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

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

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

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...