Nio*_*urf 8 python nan fill pandas
我有以下数据帧:
import numpy as np
import pandas as pd
df = pd.DataFrame(data={'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'],
'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})
Cat Vals
0 A 1
1 A 2
2 A 3
3 B 4
4 B 5
5 A NaN
6 B NaN
Run Code Online (Sandbox Code Playgroud)
我想要索引5并6填充基于'Cat'列的'Vals'的条件均值,即2和4.5
以下代码工作正常:
means = df.groupby('Cat').Vals.mean()
for i in df[df.Vals.isnull()].index:
df.loc[i, 'Vals'] = means[df.loc[i].Cat]
Cat Vals
0 A 1
1 A 2
2 A 3
3 B 4
4 B 5
5 A 2
6 B 4.5
Run Code Online (Sandbox Code Playgroud)
但我正在寻找更好的东西,比如
df.Vals.fillna(df.Vals.mean(Conditionally to column 'Cat'))
Run Code Online (Sandbox Code Playgroud)
编辑:我发现这个,这是一行更短,但我仍然不满意它:
means = df.groupby('Cat').Vals.mean()
df.Vals = df.apply(lambda x: means[x.Cat] if pd.isnull(x.Vals) else x.Vals, axis=1)
Run Code Online (Sandbox Code Playgroud)
我们希望将Cat值与缺失的NaN位置“关联” 。在熊猫中,此类关联始终通过索引进行。因此很自然地将其设置Cat为索引:
df = df.set_index(['Cat'])
Run Code Online (Sandbox Code Playgroud)
完成此操作后,即可fillna根据需要工作:
df['Vals'] = df['Vals'].fillna(means)
Run Code Online (Sandbox Code Playgroud)
要返回Cat到列,您当然可以使用reset_index:
df = df.reset_index()
Run Code Online (Sandbox Code Playgroud)
import pandas as pd
import numpy as np
df = pd.DataFrame(
{'Cat' : ['A', 'A', 'A','B', 'B', 'A', 'B'],
'Vals' : [1, 2, 3, 4, 5, np.nan, np.nan]})
means = df.groupby(['Cat'])['Vals'].mean()
df = df.set_index(['Cat'])
df['Vals'] = df['Vals'].fillna(means)
df = df.reset_index()
print(df)
Run Code Online (Sandbox Code Playgroud)
产量
Cat Vals
0 A 1.0
1 A 2.0
2 A 3.0
3 B 4.0
4 B 5.0
5 A 2.0
6 B 4.5
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4123 次 |
| 最近记录: |