简体   繁体   中英

pandas - add values into column with header into mutltiindex (header) based on variables

First, I created a pandas multi-index data frame (df). Second, I have variables and a data frame (df_TV). I like to add values from "df_TV" into "df" based on the variables "TV_Object", "TV_weight", "TV_room" and the index. Also, I like to add "TV" at the lowest level of the multi-index.

Creates the multi-index df:

header = pd.MultiIndex.from_product([
    ['Electrical Device', 'piece of furniture'],
    ['>10 Kilogramm','<10 Kilogramm'],        
    ['Kitchen', 'Living Room','Bathroom'],
    ], names=['Object','weight', 'room'])
df = pd.DataFrame(index=['a','b','c','d','e'], columns=header)
df

Create the variables and df_TV:

TV_Object = 'Electrical Device'
TV_weight = '>10 Kilogramm'
TV_room = 'Living Room'

df_TV = pd.DataFrame(np.random.randn(5,1), index=['a','b','c','d','e'], columns=['TV'])
df_TV  

I obtain, that the values will be added by index a,b,c, etc. and a new multi-index-header "TV" is under "Living Room" followed by the values. Thanks for ideas/solutions and your time!

Here it is:

Solution

df[(TV_Object, TV_weight, TV_room)] = df_TV['TV']

Output

print(df.to_string())

Object Electrical Device                                                         piece of furniture                                                        
weight     >10 Kilogramm                      <10 Kilogramm                           >10 Kilogramm                      <10 Kilogramm                     
room             Kitchen Living Room Bathroom       Kitchen Living Room Bathroom            Kitchen Living Room Bathroom       Kitchen Living Room Bathroom
a                    NaN    0.495962      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
b                    NaN   -1.040295      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
c                    NaN   -0.653766      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
d                    NaN   -0.152420      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
e                    NaN    0.950787      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN

Another answer to address your level 3 request. You'll want to change your initial dataframe:

Data

header = pd.MultiIndex.from_product([
    ['Electrical Device', 'piece of furniture'],
    ['>10 Kilogramm','<10 Kilogramm'],        
    ['Kitchen', 'Living Room','Bathroom'],
    ['TV']
    ], names=['Object','weight', 'room', 'device'])
df = pd.DataFrame(index=['a','b','c','d','e'], columns=header)
print(df.to_string())

Object Electrical Device                                                         piece of furniture                                                        
weight     >10 Kilogramm                      <10 Kilogramm                           >10 Kilogramm                      <10 Kilogramm                     
room             Kitchen Living Room Bathroom       Kitchen Living Room Bathroom            Kitchen Living Room Bathroom       Kitchen Living Room Bathroom
device                TV          TV       TV            TV          TV       TV                 TV          TV       TV            TV          TV       TV
a                    NaN         NaN      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
b                    NaN         NaN      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
c                    NaN         NaN      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
d                    NaN         NaN      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
e                    NaN         NaN      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN

Solution

TV_Object = 'Electrical Device'
TV_weight = '>10 Kilogramm'
TV_room = 'Living Room'
TV_device = 'TV'

df_TV = pd.DataFrame(np.random.randn(5,1), index=['a','b','c','d','e'], columns=['TV'])

df[(TV_Object, TV_weight, TV_room, TV_device)] = df_TV['TV']

Output

print(df.to_string())

Object Electrical Device                                                         piece of furniture                                                        
weight     >10 Kilogramm                      <10 Kilogramm                           >10 Kilogramm                      <10 Kilogramm                     
room             Kitchen Living Room Bathroom       Kitchen Living Room Bathroom            Kitchen Living Room Bathroom       Kitchen Living Room Bathroom
device                TV          TV       TV            TV          TV       TV                 TV          TV       TV            TV          TV       TV
a                    NaN   -0.599330      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
b                    NaN    0.022242      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
c                    NaN   -0.214219      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
d                    NaN    2.121647      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN
e                    NaN   -0.732355      NaN           NaN         NaN      NaN                NaN         NaN      NaN           NaN         NaN      NaN

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM