【问题标题】:How to dynamically generate Pipes in Python Pandas?如何在 Python Pandas 中动态生成管道?
【发布时间】:2021-11-20 18:24:31
【问题描述】:

我正在使用数据框构建数据增强管道。我创建了一个函数 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))

返回:

<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 都没有答案。

【问题讨论】:

  • h3_int 是什么?
  • 另外,请添加您的数据框示例。
  • @user17242583 已更新!

标签: python pandas lambda iteration pipe


【解决方案1】:

在括号内使用列表推导会返回一个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 在修改之前不会复制它。这还不错,只是需要牢记。

【讨论】:

  • 非常感谢今天的所有帮助!
  • 不客气!我认为在一天内一遍又一遍地帮助用户解决问题很有趣:D
猜你喜欢
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2019-01-31
相关资源
最近更新 更多