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

السؤال

نشر

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

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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...