【问题标题】:Create multiple columns from multiple return value of lambda function in python DataFrame从python DataFrame中lambda函数的多个返回值创建多列
【发布时间】:2015-07-15 03:34:16
【问题描述】:

Att,我想在 python DataFrame 中从 lambda 函数的多个返回值创建多个列。

与我的演示代码的最后一行类似。

有什么办法可以做到吗?

y = np.random.rand(2,5)
df = pd.DataFrame(y, columns = ["y1", "y2", "y3", "y4", "y5"])
print(df)
def f_polyfit(y1, y2, y3, y4, y5, degree):
    y = [y1, y2, y3, y4, y5]
    x = [1, 2, 3, 4, 5]
    coeffs = np.polyfit(x, y, degree)   
    coeffs = coeffs.tolist()
    # constructe the polynomial formula
    p = np.poly1d(coeffs)
    # fit values, and mean
    y_fit = p(x)                        
    y_avg = np.sum(y)/len(y)          
    ssreg = np.sum((y_fit-y_avg)**2)   
    sstot = np.sum((y - y_avg)**2)  
    R2 = ssreg / sstot
    return coeffs[0], R2
# df["slope"], df["R2"] = zip(df.apply(lambda x:f_polyfit(x["y1"], x["y2"], x["y3"], x["y4"], x["y5"], degree = 1),  axis = 1))

【问题讨论】:

    标签: python lambda dataframe


    【解决方案1】:

    一种方法是将返回值包装在pd.Series 中,以便分配给新的数据框列。

    g = lambda x: pd.Series(f_polyfit(x.y1, x.y2, x.y3, x.y5, x.y5, degree=1))
    df[['slope', 'R2']] = df.apply(g, axis=1)
    

    【讨论】:

    • 非常感谢,这正是我想要的。所以在这种情况下,返回值被转换成2个pd.Series结构?
    • 谢谢,伙计! pd.Series-ing 函数输出对我来说是令人费解的部分!
    【解决方案2】:

    使用pd.Series 的替代方法是将输出转换为列表。然后,您可以将新列分配为:

    df[['slope', 'R2']] = pd.DataFrame(df.apply(lambda x: f_polyfit(x)).tolist(), 
    index=df.index)
    

    【讨论】:

      【解决方案3】:

      解决方案是了解错误消息“太多值无法解包”。当 Python 遇到如下解包表达式时:

      a,b = x
      

      它遍历 x 并将第一个值分配给 a,第二个分配给 b,等等。如果 x 的长度正好为 2,则此语句将执行而不会出错,但如果 x 具有三个元素,它将引发“太多的值解压。”

      只有当 zip() 函数生成的迭代器正好有两个元素时,你的最后一行代码才有效。显然,事实并非如此。重要的是要认识到这个问题与 lambda 或数据帧无关,而是与 Python 解包的基础知识有关。

      【讨论】:

      • 抱歉误导,了解zip的知识很好,但我只是想将lambda函数的各种返回值折叠成DataFrame的方法。也许我不应该把错误信息放在这里。
      猜你喜欢
      • 1970-01-01
      • 2018-06-07
      • 2021-07-02
      • 2016-01-07
      • 2021-03-16
      • 2020-05-03
      • 1970-01-01
      • 2017-11-08
      • 2017-03-05
      相关资源
      最近更新 更多