简体   繁体   中英

How to fill the data frame with using the match between columns and column list and value list using pandas?

I have a data frame like this:

df
col1    col2    col3    col4    col5    col6     col7
 1
 2
 3
 4
 5

the values from col2 to col7 are empty now, Now I have two lists,

list1=[['col2'],['col5','col6'],[],['col3','col4','col5','col6'],['col7','col4']]
list2=[['1'],['2','3'],[],['4','5','6','7'],['8','9']]

I want to fill the data frame if the column names matches with list with the corresponding values with list2

The result df should look like,

col1    col2    col3    col4    col5    col6     col7
 1       1       NA      NA      NA      NA       NA
 2       NA      NA      NA      2       3        NA
 3       NA      NA      NA      NA      NA       NA
 4       NA       4       5       6      7        NA
 5       NA      NA       9      NA      NA       8

How to do it in most efficient way using pandas, python ?

Use loop solution with zip and enumerate for counter:

for i, (a, b) in enumerate(zip(list1, list2)):
    df.loc[i, a] = b

print (df)
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8

Or try create 3 column DataFrame and then pivot :

a = [(i, a1, b1) for i, (a, b) in enumerate(zip(list1, list2)) for a1, b1 in zip(a, b)]

df1 = pd.DataFrame(a).pivot(0,1,2)
print (df1)
1 col2 col3 col4 col5 col6 col7
0                              
0    1  NaN  NaN  NaN  NaN  NaN
1  NaN  NaN  NaN    2    3  NaN
3  NaN    4    5    6    7  NaN
4  NaN  NaN    9  NaN  NaN    8

and then DataFrame.join :

df = df[['col1']].join(df1)
print (df)
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8

What I will do

df.update(pd.concat([pd.DataFrame(data=[z],columns=y,index=[x]) for x , (y, z) in enumerate(zip(list1,list2))]))
df
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8

With simple loop:

In [54]: for i, col_names in enumerate(list1): 
    ...:     df.loc[i, col_names] = list2[i] 
    ...:         
    ...:                                                                                                             

In [55]: df                                                                                                          
Out[55]: 
   col1 col2 col3 col4 col5 col6 col7
0     1    1  NaN  NaN  NaN  NaN  NaN
1     2  NaN  NaN  NaN    2    3  NaN
2     3  NaN  NaN  NaN  NaN  NaN  NaN
3     4  NaN    4    5    6    7  NaN
4     5  NaN  NaN    9  NaN  NaN    8

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