我正在寻找在行上“迭代”的正确方法,或者-假设-在不进行迭代的情况下做同样的事情,因为我知道迭代不是处理数据帧中用于计算的数据的推荐方法,如this question和熊猫文档中所述。更准确地说,让我解释一下我的问题。
我有一个包含开始值,结束值和步数的数据框,例如
df_test = pd.DataFrame({"start": [-2.0, -1.0, -5.0 ],
"end": [3.0, 1.0, -1.0],
"n": [6, 3, 9]
})
我想从此数据帧为现有数据帧创建一个新列,其中包含由上述起点和终点以及点数描述的级联linspace。现有数据框具有匹配的形状。我当前的方法是使用列表推导,然后将数组连接为单个数组,然后添加列。所以:
linspacePts = np.concatenate([np.linspace(s, e, n) for s,e,n in zip(df_test["start"], df_test["end"], df_test["n"])])
df_other["lin. Pts"] = linspacePts
但是我的第一个想法是以某种方式使用df.apply。但是我不知道如何告诉np.linspace
哪个列对应于函数的哪个参数。至少,我找到了一种解决方法,但我希望通过列表和numpy数组就所需的绕行提供更好的解决方案。
感谢您的帮助!
答案 0 :(得分:1)
使用数据框的apply方法,并使用[]
语法索引所需的列。
import numpy as npd
import pandas as pd
df_test = pd.DataFrame({"start": [-2.0, -1.0, -5.0 ],
"end": [3.0, 1.0, -1.0],
"n": [6, 3, 9]
})
df_test.apply(lambda row: np.linspace(row["start"], row["end"], row["n"].astype(int)), axis=1)
如果您不熟悉lambda
函数,则以下内容相同,但更为冗长。
def create_linspace(row):
# row is a pd.Series
return np.linspace(row["start"], row["end"], row["n"].astype(int))
df_test.apply(create_linspace, axis=1)
请注意,您需要将n
的值强制转换为整数类型,因为np.linspace
会引发异常。
然后,您可以将结果与np.concatenate
连接。我不确定您打算如何将此数组添加到数据框。数据框通常是矩形的,这意味着您不能有长度不等的行。由于您的n
值不同,因此您将拥有不同的长度数组。