Как сохранить только строки с указанным c numpy массивом / формой матрицы в Pandas кадре данных? - PullRequest
0 голосов
/ 12 февраля 2020

Скажем, у меня есть фрейм данных df и столбец 'Array', который содержит набор numpy массивов. Теперь я хочу сохранить только те строки с формой массива, которые чаще всего существовали в этом столбце, и удалить другие строки. Я хочу вводить эти массивы как функции для выполнения некоторых задач машинного обучения, поэтому мне нужно убедиться, что они все в одной форме. Ниже мой сценарий, но он не работает. Я надеюсь, что ответ также должен работать, когда объекты являются матрицами.

import pandas as pd
df = pd.DataFrame(data)
lst = [i.shape for i in df['Array']]
most_common = max(set(lst), key=lst.count)
df = df[df['Array'].shape==most_common]

В основном я хочу преобразовать структуры Atomi c в числовые объекты, такие как numpy массивы или матрицы. Я использую метод под названием Кулоновская матрица для достижения этой цели. Если вы хотите попробовать себя, это весь мой сценарий:

import pandas as pd
from ase.db import connect
from ase import Atoms
from ase.io import read
import numpy as np
import numpy.linalg as linalg

def eig_data(atoms):
    init_R = atoms.positions
    init_Z = atoms.numbers
    x_list = []
    y_list = []
    z_list = []
    M_list = []
    M_tmp = []
    M_matrix = []
    for x,y,z in init_R:
        x_list.append(x)
        y_list.append(y)
        z_list.append(z)
    order=0
    for xl,yl,zl,Z in zip(x_list,y_list,z_list,init_Z):
        M_list.append((order,xl,yl,zl,Z))
        order+=1
    for order,x,y,z,charge in M_list:
        r = np.array((x,y,z))
        M_tmp = []
        for oorder,ox,oy,oz,ocharge in M_list:
            if oorder == order:
                IJ = 0.5*ocharge**2.4
                M_tmp.append(IJ)
            else:
                otr = np.array((ox,oy,oz))
                dist = np.linalg.norm(r-otr)
                InJ = (charge*ocharge)/dist
                M_tmp.append(InJ)
        M_matrix.append(M_tmp)
    M = np.array(M_matrix)
    w,v = np.linalg.eig(M)
    w_sort = np.sort(w)[::-1]
#    print(np.amax(w_sort))
    return w_sort

res = connect('c2db.db')
df = []
for row in res.select():
    atoms = row.toatoms()
    i = row.id
    c = eig_data(atoms)
    f = row.formula
    E = row.energy
    g = row.gap
    w = row.workfunction
    df.append({'id': i, 'c_matrix':c, 'formula':f, 'energy': E, 'band_gap':g, 'work_function':w})
df = pd.DataFrame(df)

lst = [i.shape for i in df['c_matrix']]
most_common = max(set(lst), key=lst.count)
df = df[df['c_matrix'].shape==most_common]

База данных может быть загружена здесь: c2db_database

1 Ответ

1 голос
/ 14 февраля 2020

Мое предложение было бы создать таким образом фильтр для вашего фрейма данных

filter = [i.shape == most_common for i in df['c_matrix']]
df = df[filter]

Или просто

df = df[[i.shape == most_common for i in df['c_matrix']]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...