如何在PythonPandas中动态生成Pipes?

How to dynamically generate Pipes in Python Pandas?

我正在使用数据帧构建数据扩充管道。我创建了一个函数 h3_int,它接受一个 int 输入并将一列十六进制值附加到数据帧。下面是 h3_int:

的实现
from h3.unstable import vect
def h3_int(df, level):
    df['h3_' + str(level)] = vect.geo_to_h3(df.lat.values, df.lng.values, level).tolist()
    return df

dflnglat 列组成:

    lat lng
0   43.64617    -79.42451
1   43.64105    -79.37628
2   43.66724    -79.41598
3   43.69602    -79.45468
4   43.66890    -79.32592
... ... ...
9515    36.10644    -115.16711
9516    36.00814    -115.17496
9517    36.10711    -115.16607
9518    36.03119    -115.05352
9519    36.13554    -115.11541

h3_int的简单用法:

df.pipe(h3_int, 8)

由于输入是动态的,我也想动态生成管道,但我一直难以实现。

代码,

(df.pipe(h3_int, i) for i in range(8, 10))

returns:

<generator object <genexpr> at 0x7fd4858557b0>

同时,

(df.pipe((h3_int, i) for i in range(8, 10)))

引发异常:

TypeError: 'generator' object is not callable

在 pandas 中实现动态管道的正确方法是什么? 不幸的是,我发现文档和 Stack Overflow 缺少答案。

使用括号内的列表理解 returns a generator,如错误消息所示,它不可索引。相反,您可以使用方括号创建一个列表,该列表 可索引的:

>>> [df.pipe(h3_int, i) for i in range(8, 9)][0]
        lat        lng                h3_8
0  43.64617  -79.42451  613256717813153791
1  43.64105  -79.37628  613256717559398399
2  43.66724  -79.41598  613256718316470271
3  43.69602  -79.45468  613256716607291391
4  43.66890  -79.32592  613256718037549055
5  36.10644 -115.16711  613220086766895103
6  36.00814 -115.17496  613220073288499199
7  36.10711 -115.16607  613220086766895103
8  36.03119 -115.05352  613220075656183807
9  36.13554 -115.11541  613220087052107775

请注意,df 已就地修改,因为您的函数 h3_int 在修改之前没有复制它。这还不错,只是要记住。