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

تسطيح flatten بيانات على شكل هرمي hierarchal في pandas

Mohamed Elnemr

السؤال

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

     USAF   WBAN  year  month  day   piece1  piece2  temp     
                                      sum     sum   max   min
0  702730  26451  1993      1    1      0      13  30.92  24.98
1  702730  26451  1993      1    2      0      13  32.00  24.98
2  702730  26451  1993      1    3     10      13  23.00   6.98
3  702730  26451  1993      1    4      0      13  10.04   3.92
4  702730  26451  1993      1    5      0      13  19.94  10.94

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

    USAF   WBAN  year  month  day   piece1 piece2  temp_max  temp_min   
0  702730  26451  1993      1    1     0    12    30.92          24.98
1  702730  26451  1993      1    2     0    13    32.00          24.98
2  702730  26451  1993      1    3    10     2    23.00          6.98
3  702730  26451  1993      1    4     0    12    10.04          3.92
4  702730  26451  1993      1    5     0    10    19.94          10.94

كيف يمكنني فعل هذا؟

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

Recommended Posts

  • 0

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

df.columns = df.columns.get_level_values(0)

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

df.columns = [' '.join(col).strip() for col in df.columns.values]

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

In [11]: [' '.join(col).strip() for col in df.columns.values]
Out[11]: 
['USAF',
 'WBAN',
 'day',
 'month',
 'piece1 sum',
 'piece2 sum',
 'temp max',
 'temp min',
 'year']

 

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

  • 0

بداية  من نسخة panda 0.24.0 ، يمكنك استخدام الدالة .to_flat_index والتي تقوم بتنفيذ المطلوب كما في المثال التالي

dat = df.loc[:,['name','workshop_period','class_size']].groupby(['name','workshop_period']).describe()
print(dat.columns)
# MultiIndex(levels=[['class_size'], ['count', 'mean', 'std', 'min', '25%', '50%', '75%', 'max']],
#            codes=[[0, 0, 0, 0, 0, 0, 0, 0], [0, 1, 2, 3, 4, 5, 6, 7]])

dat.columns = dat.columns.to_flat_index()
print(dat.columns)
# Index([('class_size', 'count'),  ('class_size', 'mean'),
#     ('class_size', 'std'),   ('class_size', 'min'),
#     ('class_size', '25%'),   ('class_size', '50%'),
#     ('class_size', '75%'),   ('class_size', 'max')],
#  dtype='object')

وللفصل بين اسماء الأعمدة يمكنك استخدام الحل التالي 

dat.columns = ["_".join(a) for a in dat.columns.to_flat_index()]

 

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

  • 0


هذا الكود البسيط يكفي:

df.columns = [''.join(t) for t in df.columns]
df

أو:

df.columns = ['_'.join(tup).rstrip('_') for tup in df.columns.values]
df
"""
USAF 	WBAN 	day 	month 	s_CDsum 	s_CLsum 	s_CNTsum 	s_PCsum 	tempfamax 	tempfamin 	year
0 	702730 	26451 	1 	1 	12.0    	0.0 	    13.0 	    1.0 	   		 30.92 	    	24.98 	1993
1 	702730 	26451 	2 	1 	13.0    	0.0     	13.0 	    0.0      		 32.00		    24.98 	1993
2 	702730 	26451 	3 	1 	2.0 	    10.0    	13.0    	1.0     		 23.00			6.98   	1993
3 	702730 	26451 	4 	1 	12.0    	0.0     	13.0    	1.0 	         10.04   		3.92    1993
4 	702730 	26451 	5 	1 	10.0    	0.0     	13.0    	3.0 	   		 19.94	    	10.94 	1993
"""

أو بالشكل التالي:

mi = df.columns
#MultiIndex نقوم باستخلاص ال
mi
"""
MultiIndex([( 'USAF',     ''),
            ( 'WBAN',     ''),
            (  'day',     ''),
            ('month',     ''),
            ( 's_CD',  'sum'),
            ( 's_CL',  'sum'),
            ('s_CNT',  'sum'),
            ( 's_PC',  'sum'),
            ('tempf', 'amax'),
            ('tempf', 'amin'),
            ( 'year',     '')],
           )
"""
# نحولها لقائمة
mi.tolist()
"""
[('USAF', ''),
 ('WBAN', ''),
 ('day', ''),
 ('month', ''),
 ('s_CD', 'sum'),
 ('s_CL', 'sum'),
 ('s_CNT', 'sum'),
 ('s_PC', 'sum'),
 ('tempf', 'amax'),
 ('tempf', 'amin'),
 ('year', '')]
"""
# نحولها الآن لفهرس
ind = pd.Index([e[0] + e[1] for e in mi.tolist()])
ind
# نسندها للأعمدة
df.columns = ind
df
"""
USAF 	WBAN 	day 	month 	s_CDsum 	s_CLsum 	s_CNTsum 	s_PCsum 	tempfamax 	tempfamin 	year
0 	702730 	26451 	1 	1 	12.0    	0.0 	    13.0 	    1.0 	    30.92 	    24.98 	1993
1 	702730 	26451 	2 	1 	13.0    	0.0     	13.0 	    0.0      	32.00 	    24.98 	1993
2 	702730 	26451 	3 	1 	2.0 	    10.0    	13.0    	1.0     	23.00     	6.98   	1993
3 	702730 	26451 	4 	1 	12.0    	0.0     	13.0    	1.0 	    10.04     	3.92 	  1993
4 	702730 	26451 	5 	1 	10.0    	0.0     	13.0    	3.0 	    19.94 	    10.94 	1993
"""

 

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

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

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

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

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

  • إعلانات

  • تابعنا على



×
×
  • أضف...