我有一个表,我想在其中填充一些空值,作为列之间的条件。桌子的一部分看起来像这样:
主 | ID_A | Col_A | Col_B | Col_C
---|---|---|---|
X | 1 | a | NaN |
X | 2 | g | fo|
X | 3 | tso||
Y | 4 | a | dc|
Y | 5 | e | r南
这比我想象的要难!这里有一种暴力的方法:
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
可以更好地完成整个任务,但我无法让它们发挥作用。