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

时间:2019-08-03 13:26:52

标签: python pandas dataframe

我有一个像这样的数据框:

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

从col2到col7的值现在为空,现在我有两个列表,

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

如果列名称与list匹配,并且list2对应的值,我想填充数据框

结果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

如何使用熊猫python以最有效的方式做到这一点?

3 个答案:

答案 0 :(得分:2)

使用带有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

或尝试创建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

然后是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

答案 1 :(得分:2)

我会做什么

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

答案 2 :(得分:1)

具有简单循环:

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