[英]How to fill the data frame with using the match between columns and column list and value list using pandas?
我有一個像這樣的數據框:
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
如何使用pandas,python以最有效的方式做到這一點?
使用帶有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
我將要做的
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
簡單循環:
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.