正如标题所说,我一直在尝试使用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])
最后我真正需要的是什么。
非常感谢任何帮助,
亚历
答案 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])
不起作用,因为函数将int
或float
作为参数。 df[0]
是Series
。但是,使用apply
方法,您可以将函数应用于df[0]
自身浮动的元素。
df[0].apply(lambda x: some_fct(x))