我有一个CSV文件,需要作为DataFrame读取,但我想在其中一列中使用converters
从pandas.read_csv
进行转换。
这是我文件中的内容:
matrix size
"(1, 2, 3, 4)" 2
"(1, 2, 3, 4, 5, 6, 7, 8, 9)" 3
matrix
中的字符串需要根据相应的大小转换为矩阵。(实际过程更复杂,数据中的值实际上对应于每个矩阵的下三角,等等(
因此,预期的输出DataFrame是:
matrix size
0 [[1, 2], [3, 4]] 2
1 [[1, 2, 3], [4, 5, 6], [7, 8, ... 3
我正在尝试使用converters
在读取列时对其进行转换。
例如,如果我想将矩阵中的字符串读取为简单数组,我可以执行以下操作:
import numpy as np
converters = {'matrix': lambda x: np.fromstring(x[1:-1], sep=',').astype('int64')}
然后读取通过这个字典的文件:
import pandas as pd
df = pd.read_csv('mydata.csv', converters=converters)
输出为:
matrix size
0 [1, 2, 3, 4] 2
1 [1, 2, 3, 4, 5, 6, 7, 8, 9] 3
在我的例子中,我有一个将字符串转换为矩阵的函数:
def array_to_matrix(array_str, size):
array = np.fromstring(array_str[1:-1], sep=',').astype('int64')
return array.reshape(size, size)
但是这个函数需要两个参数。
我可以通过以下操作解析矩阵列:
df['matrix'] = df.apply(lambda x: array_to_matrix(x['matrix'], x['size']), axis=1)
然而,我还没能找到一种使用转换器解析矩阵的方法。要使用转换器,我可以执行以下操作:
matrix_converters = dict([('matrix', lambda x, y: array_to_matrix(x, y))])
但是x
将变成matrix
(字典键(中的值,我没有办法传递y
。
我的用例更为复杂,并且能够在读取文件时解析许多类似的列,这将使我受益匪浅。
是否可以将DataFrame中的多个列传递给转换器,或者仅限于一个?
try:
df.matrix = df.apply(lambda x: np.array(eval(x[0])).reshape((x[1], x[1])), axis=1)
或矩阵不是正方形:
df.matrix = df.apply(lambda x: np.array(eval(x[0])).reshape((x[1], -1)), axis=1)
输出:
print(df)
matrix size
0 [[1, 2], [3, 4]] 2
1 [[1, 2, 3], [4, 5, 6], [7, 8, 9]] 3