Добавление записей в фрейм данных для обратного порядка индексов - PullRequest
3 голосов
/ 03 июня 2019

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

        value
  1 2    25
    3    96
    4    -12
  ...
  2 3    -25 
    4    -30
  ...
  3 4    541
    5    396
    6    14
  ...

Обратите внимание, что существует значение для записи индекса (1,2), но нет значения для (2,1).Всегда есть индексная запись (x, y) с y> x, и я хотел бы создать запись (y, x) для каждой записи (x, y), имеющей одинаковое значение.По сути, я бы хотел сделать свою матрицу данных симметричной.Я попытался переключить уровень индексов, а затем объединить результаты в новый фрейм данных, но не могу получить желаемый результат.Может быть, я мог бы сделать это с помощью цикла for, но я уверен, что есть лучший способ сделать это ... Вы знаете, как сделать это эффективно?

Ответы [ 2 ]

3 голосов
/ 03 июня 2019

Попробуйте использовать, pd.concat и swaplevel:

pd.concat([df, df.swaplevel(0,1)])

Вывод:

     value
x y       
1 2     25
  3     96
  4    -12
2 3    -25
  4    -30
3 4    541
  5    396
  6     14
2 1     25
3 1     96
4 1    -12
3 2    -25
4 2    -30
  3    541
5 3    396
6 3     14
2 голосов
/ 03 июня 2019

Вы можете распаковать, перенести, снова сложить и объединить в исходную серию:

new_df = pd.concat( (df.value, df.value.unstack(level=1).T.stack()))

Данные игрушки:

idx = [(a,b) for b in range(1,4) for a in range(1, b)]

idx = pd.MultiIndex.from_tuples(idx)

np.random.seed(10)
df = pd.DataFrame({'value': np.random.randint(-100,100, len(idx))}, index=idx)
df.sort_index(inplace=True)

# df:
#           value
# 1     2   -91
#       3    25
# 2     3   -85

Вывод (new_df):

1  2   -91.0
   3    25.0
2  3   -85.0
   1   -91.0
3  1    25.0
   2   -85.0
dtype: float64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...