さまざまな負の値を持ついくつかの不良データを含む列を持つDataFrameがあります。0未満の値をそれらが含まれるグループの平均に置き換えたいと思います。
NAとして欠落している値については、次のようにします。
data = df.groupby(['GroupID']).column
data.transform(lambda x: x.fillna(x.mean()))
しかし、次のような条件でこの操作を行うにはどうすればよいx < 0
ですか?
ありがとう!
さまざまな負の値を持ついくつかの不良データを含む列を持つDataFrameがあります。0未満の値をそれらが含まれるグループの平均に置き換えたいと思います。
NAとして欠落している値については、次のようにします。
data = df.groupby(['GroupID']).column
data.transform(lambda x: x.fillna(x.mean()))
しかし、次のような条件でこの操作を行うにはどうすればよいx < 0
ですか?
ありがとう!
@AndyHaydenの例を使用すると、 groupby
/ transform
with replace
:を使用できます。
df = pd.DataFrame([[1,1],[1,-1],[2,1],[2,2]], columns=list('ab'))
print(df)
# a b
# 0 1 1
# 1 1 -1
# 2 2 1
# 3 2 2
data = df.groupby(['a'])
def replace(group):
mask = group<0
# Select those values where it is < 0, and replace
# them with the mean of the values which are not < 0.
group[mask] = group[~mask].mean()
return group
print(data.transform(replace))
# b
# 0 1
# 1 1
# 2 1
# 3 2
これを行う1つの方法があります('b'
この退屈な例のコラムの場合):
In [1]: df = pd.DataFrame([[1,1],[1,-1],[2,1],[2,2]], columns=list('ab'))
In [2]: df
Out[2]:
a b
0 1 1
1 1 -1
2 2 1
3 2 2
b
これらの負の値をNaNに置き換えてから、各グループの平均()を計算します。
In [3]: df['b'] = df.b.apply(lambda x: x if x>=0 else pd.np.nan)
In [4]: m = df.groupby('a').mean().b
次にapply
、各行で使用して、各NaNをそのグループに置き換えます。
In [5]: df['b'] = df.apply(lambda row: m[row['a']]
if pd.isnull(row['b'])
else row['b'],
axis=1)
In [6]: df
Out[6]:
a b
0 1 1
1 1 1
2 2 1
3 2 2
追加の質問には、すばらしい例があります。
df = pd.DataFrame({'A' : [1, 1, 2, 2], 'B' : [1, -1, 1, 2]})
gb = df.groupby('A')
def replace(g):
mask = g < 0
g.loc[mask] = g[~mask].mean()
return g
gb.transform(replace)
リンク: http: //pandas.pydata.org/pandas-docs/stable/cookbook.html
私は同じ問題を抱えていて、かなり単純な解決策を思いつきました
func = lambda x : np.where(x < 0, x.mean(), x)
df['Bad_Column'].transform(func)
正しい値の平均(正の値のみに基づく平均)を返したい場合は、以下を指定する必要があることに注意してください。
func = lambda x : np.where(x < 0, x.mask(x < 0).mean(), x)