у меня есть два набора данных, расположенных в двух столбцах.dataM имеет несколько точек, которые соответствуют данным;как мне найти строки, в которых они совпадают? - PullRequest
1 голос
/ 05 июля 2019

У меня есть два набора данных, которые описывают квантовые свойства молекулы, а также энергию.DataS имеет 45 тыс. Баллов, но нет неопределенности, DataM имеет 5 тыс. Баллов, но каждая энергия имеет неопределенность.Основная цель - включить неопределенности, которые мы знаем из DataM, в более полную DataS.Используя другие квантовые свойства, которые для простоты собраны в один столбец, как я могу сопоставить данные из dataS с данными из dataS, чтобы я знал, к какой строке / позиции в dataM я могу добавить неопределенность.Мы в основном используем другие квантовые свойства, чтобы определить правильную энергию.Я не хочу функцию 1-1;он должен просеять столбец M, чтобы найти, какая строка в столбце S совпадает.

Выдержка из того, как выглядит каждый столбец:

                      S              M        ΔE
 0         0+X1Sigmag+0   0+X1Sigmag+0  0.000000
 1         0+X1Sigmag+1   2+X1Sigmag+0  0.008930
 2         0+X1Sigmag+2   4+X1Sigmag+0  0.002009
 3         0+X1Sigmag+3   6+X1Sigmag+0  0.001273
 4         0+b3Sigmag-0   8+X1Sigmag+0  0.005600
 5         0+X1Sigmag+4  10+X1Sigmag+0  0.001979
 6         0+b3Sigmag-1  12+X1Sigmag+0  0.001763
 7         0+X1Sigmag+5  14+X1Sigmag+0  0.001962
 8         0+b3Sigmag-2  16+X1Sigmag+0  0.006180
 9         0+X1Sigmag+6       2-a3Piu0  0.004950
 10        0+b3Sigmag-3       3-a3Piu0  0.005230

Очевидно, первый совпадает, поэтому я бы добавил неопределенность 0 для строки 1 (0 в качестве его Python)

 S = pd.DataFrame(data1, columns= ['Properties']).values
 M = pd.DataFrame(data2, columns= ['Properties']).values

Я организовал два фрейма данных и в настоящее время использую:

 equal_indices = []
 for i in range(len(S)): 
    for j in range(len(M)): 
        if S[i] == M[j] and M[i]==S[j]:
            equal_indices.append(j [have also tried i]) 
            print(i,j)

Это занимает слишком много времени и не дает ничего полезного ... длина - это проблема, поскольку я однажды ввел бы большие значения данныхя успешно справился с этим.

Я хотел бы закончить с кодом, который выглядит следующим образом (другие строки, которые я составил, но первая верна), но для многих совпадений:

ith row    matched property     resultant uncertainty 
0           0+X1Sigmag+0         0.000000
17          0+b3Sigmag-2         0.060789
450         2-a3Piu              0.005230

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 05 июля 2019

Во-первых, добро пожаловать в переполнение стека.

Вы можете объединить 2 кадра данных в столбце, чтобы получить точное совпадение, предполагая, что вам нужны результаты, где DataS = DataM?

Это вернет данныекак если бы вы выполнили внутреннее объединение в SQL с левым / правым ключом, обозначенным left_on / right_on.

DataM.index.name = 'M RowNum'
DataS.index.name = 'S RowNum'
Matched = DataS.reset_index()\
               .merge(DataM.reset_index(), left_on = 'S', right_on = 'M', how = 'inner')

Если вы хотите получить индекс строки из любого из них, вы можете добавить метод для сброса индексанапример DataS.reset_index(), прикрепленный к любому фрейму данных.

0 голосов
/ 05 июля 2019
        if S[i] == M[j] and M[i]==S[j]:

Если S и M имеют разные длины, то явно неправильно указывать M для i, а S для j.

        if S[i] == M[j]:

Попробуйте вместо этого; если он дает правильные результаты, но слишком медленный, мы можем начать оптимизировать.

как прикрепить этот третий столбец (который соответствует этим значениям j) по всему набору данных columnS

Чтобы объединить два набора данных, мы можем забыть о вышеупомянутых циклах и использовать (как предлагает krewsayder) DataFrame.merge :

data = data1.merge(data2, 'left', 'Properties')

Тип слияния 'left' сохраняет порядок ключей для более полного data1 набора, который вы не хотели переупорядочивать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...