Как использовать индексирование путем сопоставления строк во фрейме данных в pandas - PullRequest
1 голос
/ 15 апреля 2020

Я пытаюсь решить следующую проблему. У меня есть два набора данных, скажем, df1 и df2:

df1

NameSP  Val       Char1 BVA
0   'ACCR'  0.091941     A  Y'
1   'SDRE'  0.001395     S  Y'
2   'ACUZ'  0.121183     A  N'
3   'SRRE'  0.001512     S  N'
4   'FFTR'  0.035609     F  N'
5   'STZE'  0.000637     S  N'
6   'AHZR'  0.001418     A  Y'
7   'DEES'  0.000876     D  N'
8   'UURR'  0.023878     U  Y'
9   'LLOH'  0.004371     L  Y'
10  'IUUT'  0.049102     I  N'


df2

NameSP   Val1   Glob
0  'ACCR'  0.234  20000
1  'FFTR'  0.222  10000
2  'STZE'  0.001   5000
3  'DEES'  0.006   2000
4  'UURR'  0.134  20000
5  'LLOH'  0.034  10000

Я хотел бы выполнить индексацию df2 в df1, а затем использовать вектор индексации для различных операций матрицы. Это было бы что-то похожее на strmatch (A, B, «точный») в Matlab. Я могу правильно выполнить индексацию, используя .ilo c, а затем .isin, как показано в следующем коде:

import pandas as pd
import numpy as np

df1 = pd.read_excel('C:\PYTHONCODES\LINEAROPT\TEST_DATA1.xlsx')
df2 = pd.read_excel('C:\PYTHONCODES\LINEAROPT\TEST_DATA2.xlsx')

print(df1)
print(df2)

ddf1 = df1.iloc[:,0]
ddf2 = df2.iloc[:,0]

pindex = ddf1[ddf1.isin(ddf2)]

print(pindex.index)

, что дает мне:

Int64Index([0, 4, 5, 7, 8, 9], dtype='int64')

Но я не могу найти способ использовать этот индекс для отображения и построения моих массивов. В качестве примера я хотел бы иметь вектор, который имеет то же количество элементов, что и df1, но со значениями Val1 из df2 в индексированных позициях и нулями повсюду в другом месте. Так должно выглядеть так:

0.234
0
0
0
0.222
0.001
0
0.006
0.134
0.034
0

Или другая проблема с отображением. Как использовать такую ​​индексацию для сопоставления значений из двоеточия «Val» в df1 в векторе, который будет содержать Val из df1 в индексированных строках и нулях везде. Так что на этот раз это должно выглядеть так:

0.091941
0.0
0.0
0.0
0.035609
0.000637
0.0
0.000876
0.023878
0.004371
0.0

Есть идеи, как это сделать эффективно и элегантно?

Спасибо за помощь!

1 Ответ

1 голос
/ 15 апреля 2020

Первая проблема

df2.set_index('NameSP')['Val1'].reindex(df1['NameSP']).fillna(0)

Вторая проблема

df1['Val1'].where(df1['NameSP'].isin(df2['NameSP']), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...