@DSMにはIMOの正解がありますが、質問の一般化と最適化を共有したいと思います。複数の列をグループ化して、複数の値の列を作成します。
df = pd.DataFrame(
    {
        'category': ['X', 'X', 'X', 'X', 'X', 'X', 'Y', 'Y', 'Y'],
        'name': ['A','A', 'B','B','B','B', 'C','C','C'],
        'other_value': [10, np.nan, np.nan, 20, 30, 10, 30, np.nan, 30],
        'value': [1, np.nan, np.nan, 2, 3, 1, 3, np.nan, 3],
    }
)
...与える...
  category name  other_value value
0        X    A         10.0   1.0
1        X    A          NaN   NaN
2        X    B          NaN   NaN
3        X    B         20.0   2.0
4        X    B         30.0   3.0
5        X    B         10.0   1.0
6        Y    C         30.0   3.0
7        Y    C          NaN   NaN
8        Y    C         30.0   3.0
この一般化されたケースでは、とでグループ化しcategory、nameにのみ代入しvalueます。
これは次のように解決できます。
df['value'] = df.groupby(['category', 'name'])['value']\
    .transform(lambda x: x.fillna(x.mean()))
group-by句の列リストと、group-byのvalue直後の列を選択していることに注意してください。これにより、変換はその特定の列でのみ実行されます。これを最後に追加することもできますが、すべての列に対して実行して、最後に1つのメジャー列を除くすべてを破棄します。標準のSQLクエリプランナーはこれを最適化できたかもしれませんが、パンダ(0.19.2)はこれを行っていないようです。
実行してデータセットを増やすことによるパフォーマンステスト...
big_df = None
for _ in range(10000):
    if big_df is None:
        big_df = df.copy()
    else:
        big_df = pd.concat([big_df, df])
df = big_df
...これにより、代入する必要のない列の数に比例して速度が上がることを確認します。
import pandas as pd
from datetime import datetime
def generate_data():
    ...
t = datetime.now()
df = generate_data()
df['value'] = df.groupby(['category', 'name'])['value']\
    .transform(lambda x: x.fillna(x.mean()))
print(datetime.now()-t)
t = datetime.now()
df = generate_data()
df["value"] = df.groupby(['category', 'name'])\
    .transform(lambda x: x.fillna(x.mean()))['value']
print(datetime.now()-t)
最後に、すべてではありませんが、複数の列を代入する場合は、さらに一般化できます。
df[['value', 'other_value']] = df.groupby(['category', 'name'])['value', 'other_value']\
    .transform(lambda x: x.fillna(x.mean()))
     
              
groupbyセクションでカバーされています。覚えておくべきことが多すぎますが、「変換は、元のフレームのようにインデックスを作成するグループごとの操作用です」などのルールを選択します。