Создайте новые переменные из строки для каждой существующей переменной в панде. - PullRequest
3 голосов
/ 15 мая 2019

У меня есть датафрейм, который выглядит так:

0  target_year ID   v1  v2  
1  2000         1  0.3   1
2  2000         2  1.2   4
...
10 2001         1    3   2
11 2001         2    2   2

Я хотел бы следующий вывод:

0   ID   v1_1  v2_1  v1_2  v2_2  
1    1    0.3     1     3     2 
2    2    1.2     4     2     2

Ты хоть представляешь, как это сделать?

Ответы [ 3 ]

4 голосов
/ 15 мая 2019

Вы можете использовать pd.pivot_table, используя GroupBy.cumcount из ID в качестве столбцов.

Тогда мы можем использовать понимание списка с f-strings чтобы объединить заголовок MultiIndex в уровень sinlge:

cols = df.groupby('ID').ID.cumcount() + 1
df_piv = (pd.pivot_table(data = df.drop('target_year', axis=1)[['v1','v2']],
                         index = df.ID, 
                         columns = cols)
df_piv.columns = [f'{i}_{j}' for i,j in df_piv.columns]


     v1_1  v1_2  v2_1  v2_2
ID                        
1    0.3   3.0     1     2
2    1.2   2.0     4     2
2 голосов
/ 15 мая 2019

Используйте GroupBy.cumcount для столбца счетчика, измените его на DataFrame.set_index с DataFrame.unstack и последним сгладьте в понимании списка и f-string с:

g = df.groupby('ID').ID.cumcount() + 1

df = df.drop('target_year', axis=1).set_index(['ID', g]).unstack()
df.columns = [f'{a}_{b}' for a, b in df.columns]
df = df.reset_index()
print (df)
   ID  v1_1  v1_2  v2_1  v2_2
0   1   0.3   3.0     1     2
1   2   1.2   2.0     4     2
0 голосов
/ 15 мая 2019

Если ваши данные поступят только через два года, вы также можете merge:

cols = ['ID','v1', 'v2']
df[df.target_year.eq(2000)][cols].merge(df[df.target_year.eq(2001)][cols],
                                 on='ID',
                                 suffixes=['_1','_2'])

Выход

    ID  v1_1    v2_1    v1_2    v2_2
0   1   0.3     1       3.0     2
1   2   1.2     4       2.0     2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...