How do you rename all columns in a tiered group in pandas 0.20.1+

With the release of Pandas 0.20.1, there is a new legacy functionality for groupby.agg () with a dictionary for renaming.

Deprecation Documentation

I am trying to find a better way to update my account code for this, however I am afraid of how I am currently using this rename function.

When I execute an aggregate, I often have several functions for each source column, and I used this rename function to go to the same level index with these new column names.

Example:

df = pd.DataFrame({'A': [1, 1, 1, 2, 2],'B': range(5),'C': range(5)})

In [30]: df
Out[30]: 
   A  B  C
0  1  0  0
1  1  1  1
2  1  2  2
3  2  3  3
4  2  4  4

frame = df.groupby('A').agg({'B' : {'foo':'sum'}, 'C': {'bar' : 'min', 'bar2': 'max'}})

Result:

Out[33]: 
    B   C     
  foo bar bar2
A             
1   3   0    2
2   7   3    4

What do I usually do then:

frame = pd.DataFrame(frame).reset_index(col_level=1)

frame.columns = frame.columns.get_level_values(1)

frame
Out[42]: 
   A  foo  bar  bar2
0  1    3    0     2
1  2    7    3     4

, , , . . .

+4
3

0.20.1:

d = {'sum':'foo','min':'bar','max':'bar2'}
frame = df.groupby('A').agg({'B' : ['sum'], 'C': ['min', 'max']}).rename(columns=d)
frame.columns = frame.columns.droplevel(0)
frame = frame.reset_index()
print (frame)
   A  foo  bar  bar2
0  1    3    0     2
1  2    7    3     4

min s:

d = {'B_sum':'foo','C_min':'bar','C_max':'bar2'}
frame = df.groupby('A').agg({'B' : ['sum'], 'C': ['min', 'max']})
frame.columns = frame.columns.map('_'.join)
frame = frame.reset_index().rename(columns=d)
print (frame)
   A  foo  bar  bar2
0  1    3    0     2
1  2    7    3     4
+3

:

In [78]: d={'C_min':'min_C', 'C_sum':'sum_C','B_min':'min_B','B_sum':'sum_B'}

In [79]: frame
Out[79]:
    C       B
  min sum min sum
A
1   0   3   0   3
2   3   7   3   7

In [80]: frame.columns = frame.columns.map('_'.join).to_series().map(d)

In [81]: frame
Out[81]:
   min_C  sum_C  min_B  sum_B
A
1      0      3      0      3
2      3      7      3      7
+2

You can just call droplevelin columns and then reset_index:

In [46]:
frame.columns = frame.columns.droplevel(0)
frame = frame.reset_index()
frame

Out[46]:
   A  bar  bar2  foo
0  1    0     2    3
1  2    3     4    7
0
source

Source: https://habr.com/ru/post/1676846/


All Articles