поиск значений в (очень большом) панде и сохранение в словарях - PullRequest
0 голосов
/ 18 сентября 2018

У меня очень большой массив данных для панд.Фрейм данных выглядит следующим образом:

>> df
    "a_1"   "a_2"   "b_1"  "c_2"  ...
"d_1" nan   0.2   nan  nan
"d_2" 0.1   nan   nan   1
"e_1" nan   1     nan  0.2
"e_2" nan   0.05  0.1  0.7
"f_2" 0.2   0.5   0.3  0.9
...

Теперь я пытаюсь просмотреть список кортежей, который содержит имена строк и столбцов:

t = [("d", "a"), ("d", "c") ...]  

Например, когда i = ("d", "a")Я хочу выяснить значения, соответствующие a_1 and a_2, d_1 and d_2, и я использовал следующий код, чтобы найти значения:

s = df.loc[["d_1", "d_2" ], ["a_1", "a_2"]]

# print(s)
#       "a_1"  "a_2"
# "d_1"  nan    0.2
# "d_2   0.1    nan

# convert to list and sort the values
s = s.unstack().reset_index()
s.columns = ["A","B", "Score"]
scores = s.sort_values(by="Score", ascending=False).reset_index(drop=True)

# pick the index(rank) I want and save the not-nan data to dictionary 
rank = 1
try:
    s = scores.loc[rank,:]
except Exception:
    continue

if str(s.Score) != "nan":
    d[(s.A, s.B)] = s.Score # output dictionary

Теперь приведенный выше код работает, но занимает слишком много времени, учитывая len(t) = 28350 и мне нужно протестировать 150+ наборов параметров.Одна итерация (один набор параметров) занимает 3,5 минуты на кластере.

Мне интересно, есть ли лучшее решение этой проблемы.Заранее спасибо!

1 Ответ

0 голосов
/ 18 сентября 2018

Как насчет чего-то вроде:

d = {}
for row, col in t:
    vals = df.loc[df.index.str.startswith(row),
                  df.columns.str.startswith(col)].stack().dropna()
    if len(vals):
        d[vals.idxmax()] = vals.max()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...