按pandas DataFrame中的选定行填充

use*_*490 3 python dataframe pandas

我有下一个熊猫数据帧:

a b c 
1 1 5.0
1 1 None
1 1 4.0
1 2 1.0
1 2 1.0
1 2 4.0 
2 1 3.0
2 1 2.0
2 1 None
2 2 3.0
2 2 4.0
Run Code Online (Sandbox Code Playgroud)

我想替换None,但不是按列的意思。我想选择所有行,其中在价值观ab相似,如果c有一个None在选定行-值,只与替换它们c-mean选择行。类似的东西(此代码不起作用):

df[df[('a'==1) & ('b'==1)]]['c'].fillna(df[df[('a'==1) & ('b'==1)]]['c'].mean())
Run Code Online (Sandbox Code Playgroud)

这应该让我得到输出:

a b c 
1 1 5.0
1 1 4.5
1 1 4.0
1 2 1.0
1 2 1.0
1 2 4.0 
2 1 3.0
2 1 2.0
2 1 None
2 2 3.0
2 2 4.0
Run Code Online (Sandbox Code Playgroud)

jez*_*ael 7

您需要c按条件过滤值并分配后列c

mask = (df['a']==1) & (df['b']==1)
mean = df.loc[mask, 'c'].mean()
df.loc[mask, 'c'] = df.loc[mask, 'c'].fillna(mean)
Run Code Online (Sandbox Code Playgroud)

mask用于按条件替换:

df['c'] = df['c'].mask(mask, df['c'].fillna(mean))
#similar
#df['c'] = np.where(mask, df['c'].fillna(mean), df['c'])

print (df)
    a  b    c
0   1  1  5.0
1   1  1  4.5
2   1  1  4.0
3   1  2  1.0
4   1  2  1.0
5   1  2  4.0
6   2  1  3.0
7   2  1  2.0
8   2  1  NaN
9   2  2  3.0
10  2  2  4.0
Run Code Online (Sandbox Code Playgroud)