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

السؤال

نشر (معدل)

لدي إطار بيانات dataframe يحتوي على بعض فصائل الدم وبعض المجموعات كالتالي:

    Type       Set
1    A          A
2    B          B           
3    O          B
4    B          A

أريد أن يتم إضافة عمود جديد (بنفس عدد الصفوف في باقي الأعمدة) بناء على قيم العمود Set، فعلى سبيل المثال يتم إضافة القيمة "Group 1" في حالة كانت القيم A، وقيمة "Group 2" في حالة B

كيف يمكنني القيام بذلك؟

تم التعديل في بواسطة Fahmy Mostafa

Recommended Posts

  • 2
نشر

يمكننا إستخدام إحدى الطرق التالية:

  • الطريقة الأولى:

العبارة where والتي تستخدم لتطبيق الشروط مع البيانات الضخمة، وفيها يتم التحقق من شرط معين و تمرير قيمة ليتم إسنادها في العمود الجديد مقابل كل قيمة، و قيمة أخرى في حال عدم توفر الشرط، راجع المثال التالي:

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'Type': ['A', 'B', 'O', 'B'],
    'Set': ['A', 'B', 'B', 'A']})

df['test'] = np.where(df['Set'] == 'A', 'group1', 'group2')
df

في البدء قمنا بإستدعاء المكتبات numpy , pandas ثم عرفنا dataframe يحتوى على العمودين و بياناتهما، أخيراً قمنا بتعريف عبارة where و التي تستقبل 3 متغيرات، الأولى عبارة عن الشرط، الثاني القيمة في حال تحقق الشرط، و الثالثة هي القيمة في حال عدم تحقق الشرط. في هذه الحالة الشرط يقوم بالتحقق من القيم في كل سطر لوحده و تطبيق القيمة المختارة في السطر المقابل له في العمود الجديد.

  • الطريقة الثانية:

هي بالتعويض بإستخدام شرط داخل دالة dataframe.loc والتي تحدد عدد من الأسطر بناء على ما بالقوسين المربعين، راجع المثال التالي:

df.loc[df['Set'] == 'A', 'test'] = 'group1'
df.loc[df['Set'] == 'B', 'test'] = 'group2'
df

في البرنامج السابق نقوم بإختيار القيم التي تحتوي على 'A' في عمود Set و من ثم إسناد القيمة group1 لها في العمود المسمي test، نفس الطريقة مطبقة بالسطر الثاني.

  • الطريقة الثالثة:

هي بإستخدام list comprehension وهي من أبسط الطرق التي تعتمد على إنشاء قائمة بناء على الشرط المتحقق في كل سطر من القيم الموجودة في Set، راجع المثال التالي:

df['test'] = ['group1' if x =='A' else 'group2' for x in df['Set']]
df
  • الطريقة الرابعة:

هي بإستخدام دالة map و التي تعتمد على المدخلات في شكل dictionary حيث أن كل القيم الممرة تمثل Keys and values و المفاتيح تمثل القيم في العمود Set و الvalues ترمز للقيم التي سيتم إدراجها في العمود الجديد test في حال توافقها مع إحدي المدخلات A أو B راجع البرنامج التالي:

test ={'A' : 'group1', 'B' : 'group2'}
df['test'] = df['Set'].map(test)
df

 

 

  • 2
نشر (معدل)
import pandas as pd
df = pd.DataFrame({
    'Type': ['A', 'B', 'O', 'B'],
    'Set': ['A', 'B', 'B', 'A']
})
# طباعة الداتا الأساسية قبل التعديل
print("Initial DataFrame:")
print(df, "\n")
#apply إضافة العمود الجديد اعتماداً على تطبيق التابع 
df['newcol'] = df.apply(lambda df:"group1" if (df.Set=="A") else "group2",axis=1)
# طباعة الشكل الجديد للداتا
print("DataFrame after addition of new column")
print(df, "\n")
'''
______________________________________________________________________________________
Initial DataFrame:
  Type Set
0    A   A
1    B   B
2    O   B
3    B   A 

DataFrame after addition of new column
  Type Set  newcol
0    A   A  group1
1    B   B  group2
2    O   B  group2
3    B   A  group1
'''

يمكنك القيام بذلك كما ترى في المثال عن طريق استخدام التابع apply من مكتبة pandas مع التعبير lambda حيث نجعل متحولاً (df في مثالنا) يمر على كل سطر في ال dataframe ويختبر القيمة الموجودة في العمود المطلوب ونجعله يقرر القيمة التي سنضعها في العمود الجديد على أساس هذا الشرط، ولاتنسى أن تجعل ال axis =1  لكي يتم تطبيق التابع على كل سطر

تم التعديل في بواسطة Ali Haidar Ahmad
  • 1
نشر

بإمكانك إنشاء دالة تعمل في صفوف إطار البيانات الخاص بك كما يلي:

def f(row):
    if row['Set'] == "A":
        val = "Group 1"
    else:
        val = "Group 2"
    return val

ثم تطبيق الدالة عند إنشاء العمود الثالث:

df['New'] = df.apply(f, axis=1)

و هذا المثال ككل:

import pandas as pd  
  
data = {'Type': ['A', 'B', 'O', 'B'], 'Set': ['A', 'B', 'B', 'A']}  
  
df = pd.DataFrame(data, index =[1, 2, 3, 4])  

def f(row):
    if row['Set'] == "A":
        val = "Group 1"
    else:
        val = "Group 2"
    return val

df['New'] = df.apply(f, axis=1)
  
print(df)  

و هذا الخرج:

  Type Set      New
1    A   A  Group 1
2    B   B  Group 2
3    O   B  Group 2
4    B   A  Group 1

أيضاً يُمكنك إستخدام مكتبة numpy:

تضع الشروط و الخيارات:

conditions = [df.Set.eq("A"), df.Set.eq("B")]
choices = ["Group 1", "Group 2"]

ثم تُنشئ العمود و تُطبق الشروط و الخيارات:

df['New'] = np.select(conditions, choices)

و هذا المثال ككل:

import pandas as pd  
import numpy as np
  
data = {'Type': ['A', 'B', 'O', 'B'], 'Set': ['A', 'B', 'B', 'A']}  
  
df = pd.DataFrame(data, index =[1, 2, 3, 4])  

conditions = [df.Set.eq("A"), df.Set.eq("B")]
choices = ["Group 1", "Group 2"]

df['New'] = np.select(conditions, choices)
  
print(df)  

و ستحصل على نفس النتائج.

  • 0
نشر

يمكنك إستخدام هذه الطريقة الذي في المثال لإضافة عمود جديد بناءً على قيم عمود موجود

import pandas as pd
  
# إنشاء ال
# DataFrame
df = pd.DataFrame({'Date':['10/2/2011', '11/2/2011', '12/2/2011','13/2/2011'],'Event'['Music','Poetry','Theatre', 'Comedy'],'Cost':[10000, 5000, 15000, 2000]})
  
# إنشاء عمود جديدأسعار التخفيضات بعد تطبيق تخفيض 10% على الأسعار الموجودة
  
# إنشاء عمود جديد
df['Discounted_Price'] = df['Cost'] - (0.1 * df['Cost'])
  
# طباعة ال
# DataFrame
# إضافة العمود الجديد
print(df)

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...