为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用 pandas 的列与列列表和值列表之间的匹配来填充数据框?

如何使用 pandas 的列与列列表和值列表之间的匹配来填充数据框?

噜噜哒 2022-04-23 16:53:44
我有一个这样的数据框:dfcol1    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如何使用 pandas、python 以最有效的方式做到这一点?
查看完整描述

3 回答

?
蛊毒传说

TA贡献1895条经验 获得超3个赞

我将要做的


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


查看完整回答
反对 回复 2022-04-23
?
MM们

TA贡献1886条经验 获得超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


查看完整回答
反对 回复 2022-04-23
?
侃侃尔雅

TA贡献1801条经验 获得超16个赞

使用简单的循环:


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


查看完整回答
反对 回复 2022-04-23
  • 3 回答
  • 0 关注
  • 90 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信