是否可以将多个参数传递给pandas转换器(read_csv)



我有一个CSV文件,需要作为DataFrame读取,但我想在其中一列中使用converterspandas.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

最新更新