【问题标题】:Using a dataframe to construct an other in a for loop使用数据框在 for 循环中构造另一个
【发布时间】:2017-09-30 15:09:05
【问题描述】:

正如标题所说,我一直在尝试使用 for 循环从另一个 df 构建 Pandas DataFrame,并使用构建的最后一个列来计算新列。

到目前为止,我已经尝试过:

df = pd.DataFrame(np.arange(10))
df.columns = [10]

df1 = pd.DataFrame(np.arange(10))
df1.columns = [10]

steps = np.linspace(10,1,10,dtype = int)

这行得通:

for i in steps:
    print(i)
    df[i-1] = df[i].apply(lambda a: a-1)

但是当我尝试像这样同时构建 df 和 df1 时:

for i in steps:
    print(i)
    df[i-1] = df[i].apply(lambda a: a-df1[i])
    df1[i-1] = df1[i].apply(lambda a: a-1)

它返回很多乱码+行:

 ValueError : Wrong number of items passed 10, placement implies 1

在这个例子中,我很清楚我可以先构建 df1,然后再构建 df。但是如果我尝试它会返回相同的错误:

for i in steps:
    print(i)
    df[i-1] = df[i].apply(lambda a: a-df1[i])
    df1[i-1] = df1[i].apply(lambda a: a-df[i])

这才是我真正需要的。

非常感谢任何帮助,
亚历克斯

【问题讨论】:

    标签: python pandas lambda python-3.5


    【解决方案1】:

    apply 正在尝试沿您指定的轴应用函数。它可以是 0(将函数应用于每一列)或 1(将函数应用于每一行)。默认情况下,它将函数应用于列。在您的第一个示例中:

    for i in steps:
        print(i)
        df[i-1] = df[i].apply(lambda a: a-1)
    

    由于您的 for 循环,每一列都被循环,并且您的函数 .apply 将 1 删除到整个列。您可以将a 视为您的整个专栏。和下面的完全一样:

    for i in steps:
        print(i)
        df[i - 1] = df[i] - 1
    

    您可以通过以下方式查看.apply。假设我有以下数据框:

    df = pd.DataFrame(np.random.rand(10,4))
    

    df.sum()df.apply(lambda a: np.sum(a)) 产生完全相同的结果。这只是一个简单的示例,但如果需要,您可以进行更强大的计算。

    请注意,.apply 不是最快的方法,因此请尽量避免使用它。

    apply 很有用的一个示例是,如果您定义了一个函数 some_fct(),该函数将 intfloat 作为参数,并且您希望将其应用于数据框列的元素。

    import pandas as pd
    import numpy as np
    import math
    
    def some_fct(x):
        return math.sin(x) / x
    
    np.random.seed(100)
    df = pd.DataFrame(np.random.rand(10,2))
    

    显然,some_fct(df[0]) 无法工作,因为该函数将intfloat 作为参数。 df[0]Series。但是,使用apply 方法,您可以将您的函数应用于df[0] 的元素,这些元素本身就是浮点数。

    df[0].apply(lambda x: some_fct(x))
    

    【讨论】:

    • 感谢您的见解!如果删除 .apply() 更快更容易,那么 apply 有什么用?此外,执行此任务的最常见/可接受的方式是什么?
    • 我不是应用方面的专家,但一个例子是应用一个特殊的函数,它不会将你试图传递的对象作为参数。我会编辑我的答案,你可以看看。
    • 我明白了!非常感谢您抽出时间来回答!
    【解决方案2】:

    找到了,我只需要删除 .apply !

    例子:

    df = pd.DataFrame(np.arange(10))
    df.columns = [10]
    
    df1 = pd.DataFrame(np.arange(10))
    df1.columns = [10]
    
    steps = np.linspace(10,1,10,dtype = int)
    
    for i in steps:
        print(i)
        df[i-1] = df[i] - df1[i]
        df1[i-1] = df1[i] + df[i]
    

    它做的正是它应该做的!

    我对python没有足够的了解,我无法解释为什么

    pd.DataFrame().apply() 
    

    不会使用自身之外的东西。

    【讨论】:

    • 你确定吗?您在此处发布的此解决方案给出的答案与您在原始帖子中发布的解决方案截然不同,您在原始帖子中写道:“这有效:...”。在您的原始帖子中,在您所说的计算有效之后,df 显示一条零对角线,上三角为负数,下三角为正数。但是,在您在此处发布的解决方案中,df 显示了从-288144 的正数和负数范围。在原始帖子的文本中实际发布所需的输出可能会很有用。
    • 嗨!谢谢你的疑惑!这里的问题是用作示例的两个函数是不同的!我可能不够清楚,但我的问题只是让这样的循环给出输出而不是错误!
    猜你喜欢
    • 1970-01-01
    • 2011-09-07
    • 2018-10-12
    • 1970-01-01
    • 2020-05-22
    • 2015-05-14
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多