【问题标题】:Save numpy array into pandas cell将numpy数组保存到熊猫单元格中
【发布时间】:2020-10-17 19:53:07
【问题描述】:

这是我将一些 numpy 数组放入单元格的代码:

for name in tqdm(names):
   img = PIL.Image.open(os.path.join(TRAIN_IMG_DIR, name)).convert('RGB')
   img = np.array(img)
   idxs = tile(img)
   mydict[name] = [idxs]

df = pd.DataFrame.from_dict(mydict, orient='index').reset_index()
df.columns = ['ImageId', 'TileIds']
df.to_csv('36x224x224_otsu.csv')

这给出了:

ImageId TileIds
0   0eacb18986da2b25c5d82bd9676536e0_1.jpeg [50, 59, 122, 115, 150, 74, 66, 58, 143, 67, 2...
1   1796a7081ed86d83fddf677904d3843f_1.jpeg [96, 56, 66, 106, 43, 76, 86, 47, 45, 25, 116,...
2   9459f98d4b344c82d5c9b45a7af81b53_1.jpeg [375, 392, 184, 116, 248, 167, 217, 297, 99, 3...

到目前为止一切顺利,但是当我加载 csv 文件并显示它时,我得到了:

    ImageId TileIds
0   0452381085998676ae1e3c877df5bd4d_1.jpeg [ 7 21 1 58 69 14 15 64 74 27 8 40 47 34 79 ...
1   bbb2c6d4f203c71ba63d6ce8048d1ebc_1.jpeg [171 193 68 159 113 79 136 67 124 102 57 2...
2   ee7818bcdaf1b51212aa523778f68ee8_1.jpeg [206 224 191 172 223 197 180 190 42 251 162 2...

逗号已消失,并且插入了一些空格,因此我无法按空格分隔。 我的目标是使用该数组来索引图像列表。 我尝试了各种方法,例如泡菜和更改分隔符,但到目前为止都失败了。非常感谢您的帮助!

【问题讨论】:

    标签: python pandas numpy csv numpy-ndarray


    【解决方案1】:

    数据框基本上是一个二维结构。将列表或数组放在单元格中意味着这些单元格中的 Python 对象

    为了说明,在一个单元格中创建一个数组,在另一个单元格中创建一个列表:

    In [347]: df = pd.DataFrame([None,None], columns=['a'])                         
    In [348]: df                                                                    
    Out[348]: 
          a
    0  None
    1  None
    In [349]: df['a'][1]=[1,2,3]                                                    
    In [350]: df['a'][0]=np.array([1,2,3])                                          
    In [351]: df                                                                    
    Out[351]: 
               a
    0  [1, 2, 3]
    1  [1, 2, 3]
    

    保存:

    In [355]: df.to_csv('pd.csv', index=False)                                      
    In [356]: cat pd.csv                                                            
    a
    [1 2 3]
    "[1, 2, 3]"
    

    数组已保存为print/str 格式(带[] 且不带逗号)。该列表也保存为字符串。它可以被引用,这样逗号就不会混淆默认的逗号分隔符。

    read_csv 将这两个单元格都加载为字符串。它不会尝试将它们转换回某种 Python 对象:

    In [357]: df1 = pd.read_csv('pd.csv')                                           
    In [358]: df1                                                                   
    Out[358]: 
               a
    0    [1 2 3]
    1  [1, 2, 3]
    In [359]: type(df1['a'][0])                                                     
    Out[359]: str
    In [360]: type(df1['a'][1])                                                     
    Out[360]: str
    

    列表字符串可以轻松转换回字符串:

    In [361]: eval(df1['a'][1])                                                     
    Out[361]: [1, 2, 3]
    

    转换数组 str 需要更多的工作。该格式不适用于重新创建数组。对于大型数组(超过 1000 个项目),它甚至会有省略号 - 缺失值。

    将数组放在数据框单元格中本来就很尴尬。这个保存/加载问题只是一个问题。

    【讨论】:

      【解决方案2】:

      一个简单的解决方法是在保存之前将列表转换为字符串。然后,加载后,将字符串拆分回列表。这将确保相同的结果。

      df["TileIds"] = df["TileIds"].str.join(",")
      df.to_csv("df.csv", index=False)
      

      然后,加载后:

      df = pd.read_csv("df.csv")
      df["TileIds"] = df["TileIds"].str.split(',')
      

      【讨论】:

        猜你喜欢
        • 2017-08-02
        • 1970-01-01
        • 1970-01-01
        • 2015-03-13
        • 1970-01-01
        • 2021-08-08
        • 2022-11-19
        • 1970-01-01
        • 2021-06-15
        相关资源
        最近更新 更多