pandas выполнить несколько преобразований и создать новый фрейм данных - PullRequest
0 голосов
/ 29 мая 2020

У меня есть daframe, в котором я хочу выполнить несколько (независимых) преобразований, и они создают новый фрейм данных (с мультииндексом), где каждый индекс соответствует одному из преобразований.

Подробнее конкретно:

df = pd.DataFrame([[1, "X", 'H', 100], [2, "Y", 'K', 100] ,[3, "X", 'H', 200], [4, "Y", 'H', 100]], columns=['id', 'XY', 'HK', 'A']).set_index("id")


    XY  HK  A
id          
1   X   H   100
2   Y   K   100
3   X   H   200
4   Y   H   100

Теперь я хочу знать, сколько XY и сколько HK имеют одинаковые A. Окончательные результаты должны выглядеть так (с мультииндексом):

     XY      HK
    X   Y   H   K   
A       
100 1.0 2.0 2.0 1.0
200 1.0 NaN 1.0 NaN

Это то, что я ожидал от работы:

df.groupby(['A', 'XY', 'HK']).count()

, но он содержит только мультииндекс без значения.

То, что я смог сделать, это:

  1. подсчитать XY:

    xy_count = df.groupby(['A', 'XY']).count().HK.unstack()
    
  2. count HK:

    hk_count = df.groupby(['A', 'HK']).count().XY.unstack()
    
  3. объединить результаты (?)

    results = pd.DataFrame()
    results['XY'] = xy_count
    results['HK'] = hk_count 
    

, но эта последняя часть теперь работает.

Итак, мои вопросы:

Q1: Кажется, есть лучший способ, который мне не хватает Q2: почему шаг 3 не работает?

Не совсем вопрос, но также Меня сбивает с толку то, что для получения HK необходимо вызвать столбец XY и наоборот.

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Вы можете сделать:

groups = df.groupby('A')
pd.concat({col:groups[col].value_counts().unstack() 
           for col in ['XY','HK']}, axis=1)

Вывод:

      XY        HK     
       X    Y    H    K
A                      
100  1.0  2.0  2.0  1.0
200  1.0  NaN  1.0  NaN
1 голос
/ 29 мая 2020

сделаю melt сначала

s=df.melt('A').groupby(['A','variable']).value.value_counts().unstack([1,2])
variable   HK        XY     
value       H    K    Y    X
A                           
100       2.0  1.0  2.0  1.0
200       1.0  NaN  NaN  1.0
...