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

السؤال

نشر

لدي بيانات على شكل dataframe ، وأود أن أقوم بعمل دالة بحيث يتم تطبيقها على تلك البيانات كلها.

على سبيل المثال عمل دالة لتحديد اذا كانت القيمة مرتفعة أو متوسطة أو منخفضة بناء على قيمة العنصر العددية، كيف يمكن عمل هذا؟

Recommended Posts

  • 0
نشر

يمكنك عمل دالة بحيث يتم تطبيقها على كل البيانات باستخدام:

s.apply(func, convert_dtype=True, args=())

حيث تقوم بأخذ الدالة وتطبيقها على كل البيانات.

فمثلا لحل المشكلة التي عرضتها يمكنك الإطلاع على الكود التالي:

import pandas as pd

# قراءه البيانات
s = pd.read_csv("stock.csv", squeeze = True)

# تعريف الدالة التي تقوم بتصنيف العناصر
def fun(num):

	if num<200:
		return "Low"

	elif num>= 200 and num<400:
		return "Normal"

	else:
		return "High"

# تطبيق الدالة على البيانات
new = s.apply(fun)

# طباعة أول 3 قيم
print(new.head(3))

# طباعة قيم 3 عناصر عشوائية في المنتصف
print(new[1400], new[1500], new[1600])

# طباعة أخر 3 عناصر
print(new.tail(3))

لاحظ أن "stock.csv" هو مجرد ملف بيانات يمكنك أستبداله بأي ملف تريد.

عندما قمت بتشغيل الكود كانت هذه هي النتائج:

apply_pandas.jpg.50512db7d6f1e39f6e566625cfe014eb.jpg

  • 0
نشر

يمكنك استخداك الدالة apply كما أشار أحمد وبطرق عديدة، أولاً في حالة كان التابع الخاص بك يمرر له أكثر من قيمة أو كنت تحتاج لتطبيق تابع يستخدم قيم الأعمدة الأخرى لإنشاء عمود جديد، فيمكنك استخدام lambda مع Apply كالتالي:

# Import pandas package
import pandas as pd
# تعريف تابع
# هذا التابع نمرر له عددين ويقوم بجمعهما
def add(v1, v2):
  return v1 + v2
# تعريف داتافريم
data = {
    'c1':[1, 2, 3],
    'c2':[4, 5, 6] }
df = pd.DataFrame(data)
# طباعته
print("Original DataFrame:\n", df)	
# تطبيق التابع السابق على كل سطر من أسطر الداتا، بحيث يقوم بجمع كل قيمتين متقابلتين من أعمدة الداتا ويخزنهما في عمود جديد
#lambda قمنا باستخدام الدالة 
df['add'] = df.apply(lambda row : add(row['c1'],row['c2']), axis = 1)
print('\nAfter Applying Function: ')
# النتيجة
print(df)
"""
Original DataFrame:
    c1  c2
0   1   4
1   2   5
2   3   6

After Applying Function: 
   c1  c2  add
0   1   4    5
1   2   5    7
2   3   6    9
"""
#sumكما أنه كان بإمكانك استخدام الدالة 
df['add'] = df.apply(np.sum, axis = 1)

كما يمكنك استخدام الدالة np.vectorize وهي سريعة جداً وأسرع بكثير من الدالة السابقة ويمكنك استخدامها بالشكل الذي تريده بدون الحاجة ل lambda:

# Import pandas package
import pandas as pd
import numpy as np
# تعريف تابع
def add(v1,v2):
  return v1 + v2
# تعريف داتافريم
data = {
    'c1':[1, 2, 3],
    'c2':[4, 5, 6] }
df = pd.DataFrame(data)
print("Original DataFrame:\n", df)	
df['add'] =  np.vectorize(add)(df['c1'], df['c2']) 
print('\nAfter Applying Function: ')
print(df)
"""
Original DataFrame:
    c1  c2
0   1   4
1   2   5
2   3   6

After Applying Function: 
   c1  c2  add
0   1   4    5
1   2   5    7
2   3   6    9
"""

 

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...