группы pandas подсчитывают сосуществования

#python #pandas #dataframe #group-by

#python #pandas #фрейм данных #группировка по

Вопрос:

Я хочу получить информацию о сходстве стран по продуктам. У меня есть такой df:

    cntr  prod
0  fr    cheese
1  ger   potato
2  it    cheese
3  it    tomato
4  fr    wine
5  it    wine
6  ger   cabbage
7  fr    cabbage
  

Я пытался получить матрицу сосуществования количества продуктов, которая как таковая указывала бы мне на сходство стран:

     fr   ger  it
fr       1    2
ger 1         0
it  2    0
  

мой тест был первым, в котором я приступил к созданию перекрестной группы, пытаясь добавить 3-е измерение, чтобы получить

 fr   fr
     ger  1
     it   2
ger  fr   1
     ger
     it   0
it   fr   2
     ger  0
     it
  

это то, что я пробовал, но не удается добавить второй слой..
есть предложения?

Комментарии:

1. Что такое диагональные значения?

Ответ №1:

Я считаю, что вам нужно merge для перекрестного соединения с crosstab и, при необходимости, установить diagonal на NaN by numpy.fill_diagonal :

 df = pd.merge(df, df, on='prod')
df = pd.crosstab(df['cntr_x'], df['cntr_y']).astype(float)
np.fill_diagonal(df.values, np.nan)
print (df)
cntr_y   fr  ger   it
cntr_x               
fr      NaN  1.0  2.0
ger     1.0  NaN  0.0
it      2.0  0.0  NaN
  

Комментарии:

1. это как раз то, что нужно, израэль, большое тебе спасибо. по диагонали мне действительно все равно, так как я хочу проверять друг друга, а не себя. Я начал чувствовать, что перекрестная таблица может быть полезной, но я застрял с groupby. Спасибо!