简体   繁体   English

如何使用熊猫之间的匹配以及列列表和值列表之间的匹配来填充数据框?

[英]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, 从col2到col7的值现在为空,现在我有两个列表,

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 如果列名称与list匹配,并且list2具有对应的值,我想填充数据框

The result df should look like, 结果df应该看起来像,

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 ? 如何使用pandas,python以最有效的方式做到这一点?

Use loop solution with zip and enumerate for counter: 使用带有zip的循环解决方案并枚举计数器:

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 : 或者尝试创建3列DataFrame,然后进行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 : 然后是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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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