получить Pandas Corr матрицы, каждый столбцы наиболее коррелированные идентификаторы TypeError - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть corr_matrix после pandas df.corr как:

id | 1   2   3   4   5
---|-------------------
1  | 1  .8  .2  .5 -.1
2  |.1   1 -.4 -.1  .8
.....other ids corr

Теперь я хочу получить dataframe как

1 | 2  3  4  5
--|-----------
1 | 2 ....other
2 | 5
4 | 1
3 | 
  |

рассмотрим первый столбец:

1 | 
--|
1 | 
2 |
4 |
3 |

Здесь имя столбца 1 - это идентификатор, а его данные - это идентификаторы, которые наиболее коррелируют с ним в отсортированном порядке (от высокого к низкому), т. Е. Он соотносится с самим собой, поэтому 1 сверху и 5 отрицательно коррелированы, так что нет ' т включены

То, что я делал, это:

df = pd.DataFrame(corr_matrix.unstack())
df.sort_values(by=["id", 0], ascending=[True, False], inplace=True)
df.reset_index(inplace=True)
df.rename({"level_0": "alternative", 0: "corr"}, 
           axis='columns', inplace=True)
df = df[~(df['corr'] < 0)]

Это дало мне:

 alternative id corr
0   3        3  1.000000
1   291      3  0.777778
2   171      3  0.654654
3   567      3  0.654654
4   561      3  0.554826
5   176      3  0.518476
6   579      3  0.518476

а потом я сделал:

corr_dict= a.groupby('id')
.apply(lambda x: dict(zip(x.alternative, x.corr))).to_dict()

Это дает мне ошибку как:

TypeError: zip argument #2 must support iteration

То, что я думал, чтобы преобразовать его в dictionary, а затем обратно в dataframe с помощью:

from pandas.io.json import json_normalize
new_df = json_normalize(corr_dict)

Поскольку я новичок в pandas, есть ли простой способ сделать это, на самом деле идентификатор здесь идентификатор продукта , и я пытаюсь найти все продукты, которые связаны с каждым продуктом по убыванию порядок, который положительно коррелирует. Я должен использовать это позже где-нибудь.

ОБНОВЛЕНО

Хотя это работает для меня:

corr_dict= a.groupby('product_id')
my_dict = {}
for product_id, product_id_alternatives_df in corr_dict:
    my_dict[product_id] = list(product_id_alternatives_df.alternative)

Мне было интересно, есть ли более простой способ сделать это

Error image Correct

ОБНОВЛЕНИЕ 2

ValueError: arrays must all be same length

Поскольку массивы имеют разную длину, поэтому, получая ошибку значения, как их пропустить? поскольку корреляции отрицательны, а не идентификаторы

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