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

فصل صف من الأعمدة الى أعمدة مختلفة في pandas

Mohamed Elnemr

السؤال

لدي بيانات على الشكل التالي:

df = pd.DataFrame({"Fruits": [["Apple", "Oragne"] for i in range(7)]})

       Fruits
0  [Apple, Orange]
1  [Apple, Orange]
2  [Apple, Orange]
3  [Apple, Orange]
4  [Apple, Orange]
5  [Apple, Orange]
6  [Apple, Orange]

وأود أن أقوم بفصل العمود الثاني الذي هو عبارة عن صف الى عمودين مختلفين كالتالي:

     Fruit1  Fruit2
0    Apple   Orange
1    Apple   Orange
2    Apple   Orange
3    Apple   Orange
4    Apple   Orange
5    Apple   Orange
6    Apple   Orange

كيف أستطيع أن أقوم بهذا؟

تم التعديل في بواسطة Mohamed Elnemr
رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

تابع معي.. أول طريقة هي استخدام الدالة apply:

import pandas as pd
# هنا فقط تعريف الداتا
df = pd.DataFrame({"Fruits": [["Apple", "Oragne"] for i in range(7)]})
print("Given Dataframe is :\n",df)
# الآن سنقوم بتطبيق التابع لمدا على كل سطر من البيانات
df=df.Fruits.apply(lambda x: pd.Series(" ".join(x).split()))
print("\nSplitting Fruits column into two different columns :") 
# تغيير أسماء الأعمدة بالشمل الذي نريده
df.columns=["F1","F@"]
print(df)
"""
Given Dataframe is :
             Fruits
0  [Apple, Oragne]
1  [Apple, Oragne]
2  [Apple, Oragne]
3  [Apple, Oragne]
4  [Apple, Oragne]
5  [Apple, Oragne]
6  [Apple, Oragne]

Splitting Fruits column into two different columns :
      F1      F@
0  Apple  Oragne
1  Apple  Oragne
2  Apple  Oragne
3  Apple  Oragne
4  Apple  Oragne
5  Apple  Oragne
6  Apple  Oragne
"""

الفكرة الرئيسية في الكود السابق هو السطر:

df=df.Fruits.apply(lambda x: pd.Series(" ".join(x).split()))

كما نعلم فإن Apply يقوم بالمرور على أسطر البيانات سطر سطر ويطبق عليه تابع معين، ونحن استخدمنا التابع lambda الذي يمكننا من كتابة تابع مباشرةً، حيث يقوم هذا التابع بتحويل كل قائمة من الشكل [Apple, Oragne] إلى string من الشكل "Apple Oragne" ثم نقوم بتطبيق دالة split عليها (تقوم هذه الدالة بتحويل السلسلة النصية إللا قائمة بعد أن تقوم بفصل كلمات السلسلة على أساس محرف معين-افتراضياً يتم الفصل على أساس الفراغات-) ثم يتم تحويل القائمة الناتجة إلى pandas.sreies وهذه هي كل الفكرة. للوضوح أكثر:

# هذا مايحدث في كل سطر
" ".join(["Apple", "Oragne"])
# "Apple Oragne"
"Apple Oragne".split()
# ['Apple', 'Oragne']
pd.Series(['Apple', 'Oragne'])
"""
0     Apple
1    Oragne
dtype: object
"""

الآن بشكل مشابه قليلاً للطريقة السابقة لكنها تمنحك تحكم أقل في حال كانت المشاكلة أكثر تعقيداً وهي tolist لكنها هنا أسهل:

df=pd.DataFrame(df.Fruits.to_list(),columns = ['F1','F2'])
print("\nSplitting Fruits column into two different columns :") 
print(df)
"""
Splitting Fruits column into two different columns :
      F1      F2
0  Apple  Oragne
1  Apple  Oragne
2  Apple  Oragne
3  Apple  Oragne
4  Apple  Oragne
5  Apple  Oragne
6  Apple  Oragne
"""

في الحالة العامة أي عندما يكون لدينا نص مركب ونريد وضع كل جزء في عمود كما في المثال التالي، يكفينا استخدام الدالة split مع تحديد المحرف الذي نريد الفصل على أساسه:

import pandas as pd
df = pd.DataFrame({'Name': ['Ali Ahmad', 'Eyad Ismael']})
print("Given Dataframe is :\n",df)
print("\nSplitting 'Name' column into two different columns :\n")
df=df.Name.str.split(expand=True)
df.columns=["First","Last"]
print(df)
"""
Given Dataframe is :
           Name
0    Ali Ahmad
1  Eyad Ismael
Splitting 'Name' column into two different columns :
  First    Last
0   Ali   Ahmad
1  Eyad  Ismael
"""

 

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

  • 0

يمكنك ببساطة أستخدام الدالة to_list والتي ستقوم بعمل ما تريد تماما، حيث انها تفصل الصف الى عناصر مختلفة ومنها يمكنك جعلك تلك العناصر في شكل أعمدة.

أنظر الكود التالي للتوضيح:

df2[['Fruit1','Fruit2']] = pd.DataFrame(df2.Fruits.tolist(), index= df2.index)
print (df2)

     Fruit1  Fruit2
0    Apple   Orange
1    Apple   Orange
2    Apple   Orange
3    Apple   Orange
4    Apple   Orange
5    Apple   Orange
6    Apple   Orange

كذلك إذا أردت فصل مجوعة من العناصر لكنها ليست في شكل list، كأن تكون العلامة "," هي الفاصل بين العناصر مثلا، يمكنك استخدام الكود التالي:

pd.DataFrame(df["Fruits"].str.split('<delim>', expand=True).values,
             columns=['Fruit1', 'Fruit2'])

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...