使用数据框在for循环中构造另一个

时间:2017-05-02 23:54:31

标签: python pandas lambda python-3.5

正如标题所说,我一直在尝试使用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])

最后我真正需要的是什么。

非常感谢任何帮助,
亚历

2 个答案:

答案 0 :(得分:0)

找到它,我只需要删除.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() 

不会使用自己的东西。

答案 1 :(得分:0)

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()int作为参数的函数float,并且您希望将其应用于数据框列的元素。

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))