ndarray как столбец в кадре данных Pandas, хранящемся как объект. Как конфертировать в numpy ndarray? - PullRequest
0 голосов
/ 30 сентября 2019

Я сохранил ndarrays в столбце кадра данных Pandas. Теперь мне нужно получить максимум по столбцам суммы ndarray. Однако в Pandas ndarray хранится как объект ('O'). Следовательно, я не могу выполнять недопустимые операции.

Это то, что я пробовал, но оно не работает:

def get_max_column_of_matrix(column):
    return np.max(column.sum(0))

def apply_max_column_of_matrix(df):
    return df.assign(
        max_sum=df.apply(lambda d: get_max_column_of_matrix(d['matrix']), axis=1)
    )

Это мой пример кадра данных:

    matrix
0   "[[4 2 3]
 [1 4 3]
 [6 3 8]]"
1   "[[3 3 6]
 [2 7 6]
 [2 1 4]]"
2   "[[6 9 4]
 [8 3 6]
 [4 7 8]]"

Я ожидаю этого результата:

    max_sum
0   14
1   16
2   19
AttributeError: ("'str' object has no attribute 'sum'", 'occurred at index 0')

Ответы [ 2 ]

0 голосов
/ 30 сентября 2019

Возможно, но гораздо лучше не сохранять двумерный массив в файл, потому что действительно сложный синтаксический анализ:

import pandas as pd
import ast
import numpy as np

a = """[[4 2 3]
[1 4 3]
[6 3 8]]"""
df = pd.DataFrame({'matrix':[a,a]})

f = lambda x: np.array(ast.literal_eval(x.replace('\n',' ').replace(' ', ',')))
df['matrix']  = df['matrix'].apply(f)
print (df)
                              matrix
0  [[4, 2, 3], [1, 4, 3], [6, 3, 8]]
1  [[4, 2, 3], [1, 4, 3], [6, 3, 8]]

def get_max_column_of_matrix(column):
    return np.max(column.sum(0))

max_sum=df.apply(lambda d: get_max_column_of_matrix(d['matrix']), axis=1)
print (max_sum)
0    14
1    14
dtype: int64
0 голосов
/ 30 сентября 2019

Это сработало для меня, как в примере ниже

df = pd.DataFrame()

df["A"] = [np.random.rand(3,3) for i in range(5)]
df.apply(lambda x: x["A"].sum(0), axis=1)

похоже, что ваш "матричный" столбец является строкой, откуда вы загружаете свои данные?

попробуйте проверить типстолбец, как показано ниже

df["matrix"].apply(lambda x: type(x))

...