我有一个看起来像这样的DataFrame:
x1 x2
0 4 1
1 0 2
2 5 1
3 0 3
4 4 2
现在我想要创建另一列,其中列x1
和x2
的列平均值,如果0
为x1
,则返回0
:
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
起作用的原因很明显(系列不能用于这些操作)。
我知道使用循环很容易实现,但是有一种简化的pythonic方式吗?
正确的python数据如下:
data = pd.DataFrame({'x1': (4,0,5,0,4), 'x2': (1,2,1,3,2)})
答案 0 :(得分:3)
你非常接近。您的两种方法都应该只使用一两个调整。方法#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
如果你不在.
中的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
等等。