簡體   English   中英

如何使用熊貓之間的匹配以及列列表和值列表之間的匹配來填充數據框?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM