csv 将 Dataframe 行折叠成矩阵

xbp102n0  于 2023-01-18  发布在  其他
关注(0)|答案(3)|浏览(115)

我有一个csv文件,它可以生成一个60000 x 785的 Dataframe 。每行的第一列都有一个数字,其余的784列是该数字的像素值。我需要将784个像素压缩成28 x 28的矩阵。生成的 Dataframe 将在第一列有数字,第二列将是像素值的28x28矩阵。
digit p1 p2 p3 p4 ... p785
我尝试过改变数据的形状,但失败了,那么我应该怎么做才能改变它的形状呢?

k5ifujac

k5ifujac1#

首先将“digit”设置为索引,然后尝试以下操作:

df.apply(lambda x: x.values.reshape(28, -1), axis=1)
sr4lhrrt

sr4lhrrt2#

您可以尝试将数据存储为字典,其中键是第1列中的数字,值是包含每行像素值的大小为28x28的数组。

  • 导入包:
import csv
import numpy as np
import pandas as pd
  • 创建测试.csv文件:
with open('./test.csv', 'w', newline='', encoding='utf-8') as f:
    writer = csv.writer(f)
    for i in range(60000):
        row_i = (i+1)*np.ones(785, dtype=int)
        writer.writerow(row_i)
f.close
  • 将csv加载为 Dataframe :
data = pd.read_csv('./test.csv', header=None, index_col=0)
data = data.T.to_dict('list')
for i, value in data.items():
    data[i] = np.asarray(value).reshape(28,28)
  • 检查输出
print(len(data))
print(data)
rnmwe5a2

rnmwe5a23#

具有形状为6000行和785列的 Dataframe :

df = pd.DataFrame(…)
df.shape
# (6000, 785)

提取数字列以备后用途:

digits = df['digit']

将其他列值重新调整为(6000,28,28):

arr = df.iloc[1:].values.reshape(6000, 28, 28)
# -> np.array

将组件重新组装在一起:

df = pd.DataFrame({'digit': digits,
                   # dataframe like only 1-d things
                   'matrix': list(arr)
                  })

...顺便说一句,您的问题与How to reshape each row of a Dataframe?密切相关

相关问题