这比我想象的要难!这是一种蛮力的方法:
import pandas as pd
import numpy as np
df = pd.DataFrame({'Master': ['X','X','X','Y','Y'],
'ID_A': range(1,6),
'Col_A': ['a','g','t','a','e'],
'Col_B': [np.nan,'f','s','d','r'],
'Col_C': [np.nan,'o','o','c',np.nan]})
master_vals = df['Master'].unique()
for val in master_vals:
df_master = df[df['Master'] == val]
for row in df_master.index:
counter = 0
for col in ['Col_A','Col_B','Col_C']:
if pd.isnull(df_master.loc[row,col]):
full_df = df_master.dropna()
index = full_df.index
df.loc[row,col] = full_df.loc[index[0]+counter,'ID_A']
counter += 1
对于我们的每个主值[X,Y],我们只选择数据框中的那些行到df_master。然后从df_master遍历我们关心的行和列,寻找NaN。如果我们找到一个,那么我们搜索full_df(df_master 中不包含任何 NaN 的部分),并使用计数器选择和适当的值来帮助索引。这给我们留下了:
df
Master ID_A Col_A Col_B Col_C
0 X 1 a 2 3
1 X 2 g f o
2 X 3 t s o
3 Y 4 a d c
4 Y 5 e r 4
如果您的数据集很大,这种方法可能会非常慢,并且还可能产生意外行为,除非您的数据的结构与给出的示例完全相同。使用groupby 和stack 可能会更好地完成整个任务,但我无法让它们工作。