在熊猫数据框中访问“应用”中的不同列

时间:2020-05-10 22:21:16

标签: python pandas numpy

我正在寻找在行上“迭代”的正确方法,或者-假设-在不进行迭代的情况下做同样的事情,因为我知道迭代不是处理数据帧中用于计算的数据的推荐方法,如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数组就所需的绕行提供更好的解决方案。

感谢您的帮助!

1 个答案:

答案 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值不同,因此您将拥有不同的长度数组。