如何在方法链的下一个方法中正确引用以前的Pandas DataFrame ?



我一直在尝试在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;管;功能应用程序;方法链中的赋值

相关内容

  • 没有找到相关文章

最新更新