1

次のような DataFrame があります。

   x1  x2 
0   4   1 
1   0   2 
2   5   1 
3   0   3 
4   4   2 

x1ここで、列との平均をとる別の列を作成したい、または が の場合にx2返す:0x10

   x1  x2  ave
0   4   1  2.5 
1   0   2  0
2   5   1  3 
3   0   3  0
4   4   2  3

これも

data['ave'] = (data['x1'] + data['x2'])/2 if data['x1'] > 0 else 0

これも

data['ave'] = (data['x1'] != 0)*(data['x1'] + data['x2'])/2

明らかな理由で機能します(これらの操作ではシリーズを使用できません)。

これはループを使用して簡単に達成できることは知っていますが、それを行う簡単な方法はありますか?

適切な python データは以下のとおりです。

data = pd.DataFrame({'x1': (4,0,5,0,4), 'x2': (1,2,1,3,2)})
4

1 に答える 1

3

あなたはとても近くにいます。どちらのアプローチも、1 つまたは 2 つの微調整で機能するはずです。方法 #1:

>>> df = pd.DataFrame({'x1': (4,0,5,0,4), 'x2': (1,2,1,3,2)})
>>> df["ave"] = (df["x1"] != 0) * (df["x1"] + df["x2"])/2.
>>> df
   x1  x2  ave
0   4   1  2.5
1   0   2  0.0
2   5   1  3.0
3   0   3  0.0
4   4   2  3.0

.inを省略し、列が整数の場合2.、整数除算のために期待した結果が得られない可能性がありますが、Series問題なく使用できます。

方法 #2:

df["ave"] = df.apply(lambda r: (r["x1"] + r["x2"])/2. if r["x1"] > 0 else 0, axis=1)

に関数を渡してapply指定しますaxis=1

方法 #3a、3b:

df["ave"] = df.mean(axis=1) * (df["x1"] != 0)

また

df["ave"] = df[["x1", "x2"]].mean(axis=1)
df["ave"][df["x1"] == 0] = 0

など。

于 2013-04-22T04:03:14.543 に答える