我有一个像这样的数据框:
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以最有效的方式做到这一点?
答案 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