Как сложить структуру парных данных, как это? - PullRequest
2 голосов
/ 10 апреля 2020

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

df_dict = {'FamID' : [1, 2], 'Person_1' : ['Husband', 'Granpa'] , 'Person_2' : ['Wife', 'Grandson'], 'Higher_income' : [1, 0]}
df = pd.DataFrame(df_dict)
df = df.set_index('FamID')

Он сравнивает доход между членами домохозяйства. Таким образом, для столбца Higher_income 1 означает, что Person_1 имеет более высокий доход, а 0 означает Person_2.

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

enter image description here

Ответы [ 3 ]

3 голосов
/ 10 апреля 2020

Для ваших данных:

s = (df_tmp.filter(like='Person').stack()
         .reset_index(level=-1, drop=True)
         .reset_index(name='Person')
    )

s.loc[::2, 'Higher_income'] = df_tmp.Higher_income.values
s.loc[1::2,'Higher_income'] = 1 - df_tmp.Higher_income.values

Вывод:

   FamID    Person  Higher_income
0      1   Husband            1.0
1      1      Wife            0.0
2      2    Granpa            0.0
3      2  Grandson            1.0
2 голосов
/ 10 апреля 2020

IIU C wide_to_long

df=pd.wide_to_long(df.reset_index(),['Person'],i=['FamID'],j='Key',sep='_').reset_index(level=1).assign(Higher_income=lambda x : x['Higher_income'].ne(x['Key']-1).astype(int)).sort_index()
#you can add the .drop('Key',1) at the end 

Out[51]: 
       Key  Higher_income    Person
FamID                              
1        1              1   Husband
1        2              0      Wife
2        1              0    Granpa
2        2              1  Grandson
1 голос
/ 10 апреля 2020

Вы можете создать фиктивные столбцы с одинаковыми суффиксами, чтобы выяснить, кто имеет самый высокий_инком. Тогда wide_to_long. Это будет хорошо масштабироваться для многих людей, если метка Higher_income соответствует суффиксу столбца Person_i.

# Make labels match Person_i format. 
df['Higher_income'] = df['Higher_income'].replace(0, 2)

df = pd.get_dummies(df, columns=['Higher_income']).reset_index()
#   FamID Person_1  Person_2  Higher_income_1  Higher_income_2
#0      1  Husband      Wife                1                0
#1      2   Granpa  Grandson                0                1

(pd.wide_to_long(df, i='FamID', j='num', stubnames=['Person', 'Higher_income'], sep='_')
   .reset_index('num', drop=True))

#         Person  Higher_income
#FamID                         
#1       Husband              1
#2        Granpa              0
#1          Wife              0
#2      Grandson              1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...