我知道assign可以帮助创建/更改一个基于lambda函数的列,如下所示:
df.assign(c = lambda x: x.sum())
但如果我想让语句内联而不是在操作之外单独执行,那么我无法找到使用if语句执行此操作的方法。
是否有可能在不执行任何操作的情况下实现此目的:
df.assign(c = lambda x: x.num_col.sum() if x.num_col > 0)
以上命令返回" SyntaxError :语法无效"
答案 0 :(得分:2)
IIUC你可以这样做:
数据:强>
?wsdl
让我们在In [6]: df = pd.DataFrame(np.random.randn(10,2),columns=list('ab'))
In [7]: df
Out[7]:
a b
0 0.493970 1.095644
1 0.128510 -0.542144
2 0.136247 -0.544499
3 -0.540835 -0.100574
4 0.052725 -0.164856
5 -1.201619 1.578153
6 1.921872 0.505875
7 -2.519725 0.282050
8 -1.581868 -0.240352
9 -0.071207 -1.366953
In [8]: df.iloc[:6]
Out[8]:
a b
0 0.493970 1.095644
1 0.128510 -0.542144
2 0.136247 -0.544499
3 -0.540835 -0.100574
4 0.052725 -0.164856
5 -1.201619 1.578153
6 1.921872 0.505875
列中找到索引的正值之和:a
:
[0:6]
<强>解决方案:强>
In [9]: df.iloc[:6].query('a > 0').a.sum()
Out[9]: 2.733322288547374
与重命名的列相同:
In [10]: df.iloc[:6].assign(c=lambda x: x.query('a > 0').a.sum())
Out[10]:
a b c
0 0.493970 1.095644 2.733322
1 0.128510 -0.542144 2.733322
2 0.136247 -0.544499 2.733322
3 -0.540835 -0.100574 2.733322
4 0.052725 -0.164856 2.733322
5 -1.201619 1.578153 2.733322
6 1.921872 0.505875 2.733322
更新:从Pandas 0.20.1 the .ix indexer is deprecated, in favor of the more strict .iloc and .loc indexers开始。
答案 1 :(得分:0)
语法无效,因为您使用的是三元条件,但只使用了上半部分。
三元条件允许您编写if
语句,如下所示:
a = 1 if b > 0 else 0
在你的情况下,你可以这样写:
df = (
df
.assign(c = lambda x: x.num_col.sum() if x.num_col > 0 else 0)
)
请注意最后添加else 0
。