【问题标题】:Adding ndarray into dataframe and then back to ndarray将 ndarray 添加到数据框中,然后返回到 ndarray
【发布时间】:2021-09-10 19:31:06
【问题描述】:

我有一个看起来像这样的 ndarray:

x

我想将其添加到现有数据框中,以便可以将其导出为 csv,然后在单独的 python 脚本中使用该 csv,拉出 ndarray 并进行一些分析,主要是为了不有一个很长的 python 脚本。

要将其添加到数据框中,我已完成以下操作:

data["StandardisedFeatures"] = x.tolist()

这对我来说看起来不错。但是,在我的下一个脚本中,当我尝试提取数据并将其作为数组放回时,它看起来不一样,它用单引号括起来并将其视为字符串:

data['StandardisedFeatures'].to_numpy()

我尝试过 astype(float) 但它似乎不起作用,有人可以提出解决此问题的方法吗?

谢谢。

【问题讨论】:

    标签: python dataframe series numpy-ndarray


    【解决方案1】:

    您可以在 DataFrame 中保存任何类型的对象。

    您保留它们的类型,但它们将在pandas.DataFrame.info() 中归类为“对象”。

    示例:保存列表

    df = pd.DataFrame(dict(my_list=[[1,2,3,4], [1,2,3,4]]))
    print(type(df.loc[0, 'my_list']))
    # Print: list
    

    如果您将对象直接与pandas.DataFrame.apply() 一起使用,这将非常有用。

    【讨论】:

      【解决方案2】:

      也许解决此问题的另一种更简单的方法是使用numpy.savenumpy.load 函数。然后可以将数组保存为numpy数组对象,在下一个脚本中直接作为numpy数组再次加载:

      import numpy as np
      x = np.array([[1, 2], [3, 4]])
      # Save the array in the working directory as "x.npy" (extension is automatically inserted)
      np.save("x", x)
      # Load "x.npy" as a numpy array
      x_loaded = np.load("x.npy")
      

      【讨论】:

        【解决方案3】:

        如果您在 DataFrame 中的列表对象在处理时变成了字符串(有时会发生),您可以使用 evalast.literal_eval 函数从字符串转换回列表,并使用 map 为每个元素执行此操作.

        下面是一个例子,可以让你了解如何处理这个问题:

        import pandas as pd
        import numpy as np
        
        dic = {"a": [1,2,3], "b":[4,5,6], "c": [[1,2,3], [4,5,6], [1,2,3]]}
        df = pd.DataFrame(dic)
        
        print("DataFrame:", df, sep="\n", end="\n\n")
        
        print("Column of list to numpy:", df.c.to_numpy(), sep="\n", end="\n\n")
        temp = df.c.astype(str).to_numpy()
        
        print("Since your list objects have somehow become str objects while working with df:", temp, sep="\n", end="\n\n")
        
        print("Magic for what you want:", np.array(list(map(eval, temp))), sep="\n", end="\n\n")
        

        输出:

        DataFrame:
        a  b          c
        0  1  4  [1, 2, 3]
        1  2  5  [4, 5, 6]
        2  3  6  [1, 2, 3]
        
        Column of list to numpy:
        [list([1, 2, 3]) list([4, 5, 6]) list([1, 2, 3])]
        
        Since your list objects have somehow become str objects while working with df:
        ['[1, 2, 3]' '[4, 5, 6]' '[1, 2, 3]']
        
        Magic for what you want:
        [[1 2 3]
        [4 5 6]
        [1 2 3]]
        

        注意:我在示例中使用了eval,只是因为更多人熟悉它。当您需要 eval 时,您应该更喜欢使用 ast.literal_evalThis SO post 很好地解释了为什么要这样做。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-01-28
          • 2019-10-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-04-01
          相关资源
          最近更新 更多