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

السؤال

نشر

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...