Fahmy Mostafa نشر 22 يوليو 2021 أرسل تقرير نشر 22 يوليو 2021 لدي إطار البيانات التالي: >>> 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 اقتباس
2 Ali Haidar Ahmad نشر 22 يوليو 2021 أرسل تقرير نشر 22 يوليو 2021 (معدل) المشكلة في التعليمات البرمجية الخاصة بك هي أنك تريد تطبيق العملية على كل صف. الطريقة التي كتبتها بها تأخذ عمودي "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 """ تم التعديل في 22 يوليو 2021 بواسطة Ali Haidar Ahmad 3 اقتباس
0 عبدالله عبدالرحمن11 نشر 22 يوليو 2021 أرسل تقرير نشر 22 يوليو 2021 يمكنك ببساطة استخدام الكود الآتي 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 ريم المهدي نشر 23 يوليو 2021 أرسل تقرير نشر 23 يوليو 2021 المشكلة هي أن الأرقام في 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 اقتباس
السؤال
Fahmy Mostafa
لدي إطار البيانات التالي:
والآن أريد تحويله إلى التالي:
حاولت أن أقوم بذلك من خلال Pands كالتالي:
لكن الكود السابق يسبب لي مشكلة ويخرج متيجة مختلفة عما أريد:
هل يمكن أن أستخدم Numpy لعمل هذا التغير؟ وكيف أقوم بذلك؟
3 أجوبة على هذا السؤال
Recommended Posts
انضم إلى النقاش
يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.