Разделение пар строк данных по общим именам - PullRequest
0 голосов
/ 05 июня 2018

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

         1   2
a_value  2   8
a_ref    4   2
b_value  6  10
b_ref    3  15
c_value  7   3

обратите внимание, что некоторые индексы являются парами name_value и name_ref, а другие - не

Я хочу найти этипары, и для каждой пары получите четыре строки в моем новом фрейме данных: name_value, name_ref, name_ref/name_value, name_value/name_ref, поэтому мой выходной фрейм данных выглядит следующим образом:

                 1       2
a_value        2.0   8.000
a_ref          4.0   2.000
a_value/a_ref  0.5   4.000
a_ref/a_value  2.0   0.250
b_value        6.0  10.000
b_ref          3.0  15.000
b_value/b_ref  2.0   0.666
b_ref/b_value  0.5   1.500

В настоящее время я делаю этоперебирая индексы в поисках тех, которые заканчиваются на value, а затем пытаясь найти совпадающие ref, но зная панд, кажется, что должен быть более простой способ, возможно, как-то использовать groupby.Так что .. есть?

1 Ответ

0 голосов
/ 05 июня 2018

Возможно, это не самое элегантное решение, но оно работает.Сначала давайте найдем общие ключи:

import numpy as np
keys = np.intersect1d(df.index.str.extract("(.+)_value").dropna(),
                      df.index.str.extract("(.+)_ref").dropna())
#array(['a', 'b'], dtype=object)

Затем выберите соответствующие ссылки и значения:

refs   = df.loc[keys + "_ref"]
values = df.loc[keys  +"_value"]

Сделайте копию каждого кадра данных и назначьте им ключи в виде индексов:

values1 = values.copy()
values1.index = keys
refs1 = refs.copy()
refs1.index = keys

Выполните деление и обновите индексы еще раз:

ratios = values1 / refs1
ratios.index += "_value" + "/" + ratios.index + "_ref"
ratios1 = refs1 / values1
ratios1.index += "_ref" + "/" + ratios1.index + "_value"

Соберите все вместе и сортируйте:

pd.concat([refs, values, ratios, ratios1]).sort_index()
#                 1          2
#a_ref          4.0   2.000000
#a_ref/a_value  2.0   0.250000
#a_value        2.0   8.000000
#a_value/a_ref  0.5   4.000000
#b_ref          3.0  15.000000
#b_ref/b_value  0.5   1.500000
#b_value        6.0  10.000000
#b_value/b_ref  2.0   0.666667
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...