我一直在尝试在Pandas中使用方法链接,但是有一些与如何引用DataFrame或其列相关的事情使我不断绊倒。
例如,在下面的代码中,我已经过滤了数据集,然后想要创建一个新列,将过滤后剩余的列相加。但是,我不知道如何引用刚刚从过滤器创建的DataFrame。
df = pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
df = (
df
.filter(like='x')
.assign(n = df
.sum(axis=1))
)
df.head(6)
或者在这个实例中,DataFrame在方法链中被创建,这通常是一个pd。read_csv步骤,而不是生成DataFrame。这段代码自然不能工作,因为df2还没有创建。
df2 = (
pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
.assign(
xx = df2['xx'].mask(df2['xx']>2,0)
)
)
df2.head(6)
有趣的是,上面的问题在这里不是问题,因为df3['xx']指的是已经查询过的df3,这在第二个例子的上下文中是有意义的,但在第一个例子中没有意义。
df3 = pd.DataFrame(
{
'xx':[1,2,3,4,5,6],
'xy':[1,2,3,4,5,6],
'z':[1,2,3,4,5,6],
}
)
df3 = (
df3
.query('xx > 3')
.assign(
xx = df3['xx'].mask(df3['xx']>4,0)
)
)
df3.head(6)
我曾在其他语言/库(如R或PySpark)中工作过,方法链非常灵活,似乎没有这些障碍。除非我对如何在Pandas中完成它或您如何以其他方式引用df['xx']有什么遗漏。
最后我明白,示例问题很容易解决,但我试图理解是否有一组方法链接语法,我可能不知道引用这些列时。
对于基于先前计算的DataFrame引用,匿名函数(lambda帮助):
df.filter(like='x').assign(n = lambda df: df.sum(1))
xx xy n
0 1 1 2
1 2 2 4
2 3 3 6
3 4 4 8
4 5 5 10
5 6 6 12
它基本上引用了前面的DataFrame。
pipe
方法是另一个选项,您可以在引用计算的DataFrame时链接方法。
下面的例子是superflous;希望它能解释pipe
是如何工作的:
df3.pipe(lambda df: df.assign(r = 2))
Out[37]:
xx xy z r
0 1 1 1 2
1 2 2 2 2
2 3 3 3 2
3 4 4 4 2
4 5 5 5 2
5 6 6 6 2
不是所有的Pandas函数都支持链接;这就是管道函数可以派上用场的地方;您甚至可以编写自定义函数并将其传递给pipe
。
所有这些信息都在文档中:assign;管;功能应用程序;方法链中的赋值