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.