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

السؤال

نشر (معدل)

لدي بيانات على شكل 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.

  • إعلانات

  • تابعنا على



×
×
  • أضف...