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

فصل عمود من القواميس إلى عدة أعمدة في pandas

Mohamed Elnemr

السؤال

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

Station ID     Pollutants
1000           {"col1": "46", "col2": "3", "col3": "12"}
1001           {"col1": "36", "col1": "5", "col3": "8"}
1002           {"col2": "2", "col3": "7"}
1003           {"col3": "11"}
1004           {"col1": "82", "col3": "15"}

وأريد تحويلها الى الشكل dataframe بحيث يكون العمود الثاني pollutants متقسم الى عدة أعمدة كالتالي:

Station ID     col1  col2    col3
1000           46     3       12
1001           36     5       8
1002           NaN    2       7
1003           NaN    NaN     11
1004           82     NaN     15

كيف يمكنني أن أفعل هذا بسهولة؟

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

Recommended Posts

  • 0

يمكنك انشاء هذا بسهولة عن طريق استخدام دالة apply(pd.Series). كالتالي:

df = pd.DataFrame({'col1':[1,2,3], 'col2':[{'c':1}, {'d':3}, {'c':5, 'd':6}]})

df

 col1             col2
0  1           {u'c': 1}
1  2           {u'd': 3}
2  3  {u'c': 5, u'd': 6}

df['b'].apply(pd.Series)

    col3  col4
0  1.0  NaN
1  NaN  3.0
2  5.0  6.0

بعد ذلك يمكنك دمجها مع بقية البيانات باستخدام concat كالتالي:

 pd.concat([df.drop(['col2'], axis=1), df['col2'].apply(pd.Series)], axis=1)

 col1  c   d
0  1  1.0  NaN
1  2  NaN  3.0
2  3  5.0  6.0

كذلك يمكنك استخدام tolist بدلا من .apply(pd.series) :

pd.concat([df.drop('b', axis=1), pd.DataFrame(df['b'].tolist())], axis=1)

 col1   c   d
0  1  1.0  NaN
1  2  NaN  3.0
2  3  5.0  6.0

يمكنك ايضا استخدام json لفصل العمود عن بعضه كالتالي:

import pandas as pd

df2 = pd.json_normalize(df['Pollutant Levels'])

 

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

  • 0

إضافة لما قدمه أحمد يمكنك القيام بذلك بالشكل التالي من خلال الدالة json_normalize:

import pandas as pd
from ast import literal_eval
import numpy as np
df = {'Station ID': [8809, 8810, 8811, 8812, 8813, 8814],
        'Pollutants': ['{"a": "46", "b": "3", "c": "12"}', '{"a": "36", "b": "5", "c": "8"}', '{"b": "2", "c": "7"}', '{"c": "11"}', '{"a": "82", "c": "15"}', np.nan]}
df = pd.DataFrame(df)
df
"""
   Station ID                        Pollutants
0        8809  {"a": "46", "b": "3", "c": "12"}
1        8810   {"a": "36", "b": "5", "c": "8"}
2        8811              {"b": "2", "c": "7"}
3        8812                       {"c": "11"}
4        8813            {"a": "82", "c": "15"}
5        8814                               NaN
"""
# '{}' نقوم باستبدال القيم المفقودة ب
# وذلك إذا كان العمود عبارة عن سلاسل نصية   
# df.Pollutants = df.Pollutants.fillna('{}')
df.Pollutants = df.Pollutants.fillna({i: {} for i in df.index})  # {} أما إذا لم يكن سلاسل نصية نستبدله ب
# تحويل عمود القواميس إلى قواميس
# تخطي هذا السطر، إذا كان العمود يحتوي على قاموس
df.Pollutants = df.Pollutants.apply(literal_eval)
# لتقسيم العمود json_normalize الآن نقوم بتطبيق التابع
#لدمج الناتج مع بيانات الداتافريم الأساسي join ثم بعدها نقوم بتطبيق 
df = df.join(pd.json_normalize(df.Pollutants))
#Pollutants الآن نحذف العمود
df.drop(columns=['Pollutants'], inplace=True)
# نستعرض البيانات
df
"""
   Station ID    a    b    c
0        8809   46    3   12
1        8810   36    5    8
2        8811  NaN    2    7
3        8812  NaN  NaN   11
4        8813   82  NaN   15
5        8814  NaN  NaN  NaN
"""

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...