【问题标题】:Applying a function to two columns of pandas dataframe to get two new columns将函数应用于两列熊猫数据框以获得两列新列
【发布时间】:2016-09-13 23:12:15
【问题描述】:

我有一个带有 LongitudeLatitude 列的 pandas 数据框。我想从他们那里得到XYutm 中有一个名为 from_latlon 的函数可以执行此操作。它接收LatitudeLongitude 并给出[X,Y]。这是我的工作:

    def get_X(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[0]

    def get_Y(row):
        return utm.from_latlon(row['Latitude'], row['Longitude'])[1] 

    df['X'] = df.apply(get_X, axis=1)
    df['Y'] = df.apply(get_Y, axis=1)

我想定义一个函数get_XY 并应用from_latlon 一次以节省时间。我查看了hereherehere,但我找不到用一个apply 函数制作两列的方法。谢谢。

【问题讨论】:

    标签: python pandas multiple-columns apply


    【解决方案1】:

    你可以从你的函数中返回一个列表:

    d = pandas.DataFrame({
        "A": [1, 2, 3, 4, 5],
        "B": [8, 88, 0, -8, -88]
    })
    
    def foo(row):
        return [row["A"]+row["B"], row["A"]-row["B"]]
    
    >>> d.apply(foo, axis=1)
        A   B
    0   9  -7
    1  90 -86
    2   3   3
    3  -4  12
    4 -83  93
    

    您也可以返回一个系列。这使您可以指定返回值的列名:

    def foo(row):
        return pandas.Series({"X": row["A"]+row["B"], "Y": row["A"]-row["B"]})
    
    >>> d.apply(foo, axis=1)
        X   Y
    0   9  -7
    1  90 -86
    2   3   3
    3  -4  12
    4 -83  93
    

    【讨论】:

    • 根据您的第一个解决方案,我使用temp = d.apply(foo, axis=1),然后使用d['sum'] = [item[0] for item in temp]d['subtract'] = [item[1] for item in temp]。有没有更好的方法来做到这一点。如果我这样做 d[['sum','subtract']] = d.apply(foo, axis=1) 我会收到错误消息。我想此时是将结果返回到原始数据框中的问题。不幸的是,由于我的特定功能,您的第二个解决方案对我不起作用。谢谢。
    • @bikhaab:没有简单的方法可以一次将多个列分配到 DataFrame 中,所以这是一个单独的问题。您可以使用concatmerge 将结果DataFrame 与您原来的DataFrame 连接起来。有关一些相关想法,请参阅this question
    【解决方案2】:

    我合并了来自类似线程的几个答案,现在我在 Jupyter/pandas 中使用了一个通用的多列输入、多列输出模板:

    # plain old function doesn't know about rows/columns, it just does its job.
    def my_func(arg1,arg2):
        return arg1+arg2, arg1-arg2  # return multiple responses
    
    df['sum'],df['difference'] = zip(*df.apply(lambda x: my_func(x['first'],x['second']),axis=1))
    

    【讨论】:

      猜你喜欢
      • 2013-02-13
      • 2020-11-18
      • 2019-02-07
      • 2020-04-06
      • 2017-11-29
      • 2017-06-09
      • 2015-08-29
      • 2021-02-12
      • 2013-04-20
      相关资源
      最近更新 更多