преобразование дублированных данных из строки в столбцы - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть такие данные, как:

name    val trc
jin      23 apb
tim      52 nmq
tim      61 apb
tim      92 rrc
ron      13 apq
stark    34 rrc
stark    34 apq
ron       4 apq
sia       6 wer

Я ищу вывод как:

name    val_1   trc1    val_2   trc2    val_3   trc3
jin        23   apb             
tim        92   rrc        61   apb        52   nmq
ron        13   apq         4   apq     
stark      34   rrc        34   apq     
sia         6   wer 

я хочу преобразовать дублирующиеся значения в строке в столбец с самым высоким значением val в val_1 и меньшим значением val в val_2 и так далее. даже значение trc1 должно соответствовать val_1. Пожалуйста, дайте мне знать, как этого добиться.

Я попробовал этот подход:

d = {k: v.reset_index(drop=True) for k, v in df.groupby('name')}
pd.concat(d, axis=1).reset_index()
  index  jin             ron             sia            stark             tim  \
        name   val  trc name   val  trc name  val  trc   name   val  trc name   
0     0  jin  23.0  apb  ron  13.0  apq  sia  6.0  wer  stark  34.0  rrc  tim   
1     1  NaN   NaN  NaN  ron   4.0  apq  NaN  NaN  NaN  stark  34.0  apq  tim   
2     2  NaN   NaN  NaN  NaN   NaN  NaN  NaN  NaN  NaN    NaN   NaN  NaN  tim   

Ответы [ 3 ]

0 голосов
/ 01 ноября 2018

Использование:

df1 = df.sort_values(['name','val'], ascending=False)

df1 = df1.set_index('name').stack().groupby(level=0).apply(list).apply(pd.Series)

df1 = df1.reset_index().fillna("")

print(df1)

   name   0    1    2     3   4   5
0  jin   23  apb                
1  ron   13  apq    4   apq     
2  sia    6  wer                
3  stark 34  rrc   34   apq     
4  tim   92  rrc   61   apb  52  nmq
0 голосов
/ 01 ноября 2018

Здесь опция, использующая pivot:

df['index'] = df.groupby('name').cumcount()
df_vals = df.pivot(index='name', columns='index', values='val').rename(columns=lambda x: 'val_'+str(x))
df_trcs = df.pivot(index='name', columns='index', values='trc').rename(columns=lambda x: 'trc_'+str(x))

df_vals.join(df_trcs).fillna('').reset_index()

index   name    val_0   val_1   val_2   trc_0   trc_1   trc_2
0       jin     23.0                    apb     
1       ron     13.0    4               apq     apq 
2       sia     6.0                     wer     
3       stark   34.0    34              rrc     apq 
4       tim     52.0    61  92          nmq     apb     rrc  
0 голосов
/ 01 ноября 2018

Преобразуйте ваш объект в словарь с именами в качестве ключей и вашими значениями и trcs как связанными значениями в кортеже или списке.

Вы хотите получить что-то вроде этого:

yourDict[name] = [ [val_1, trc1] , [val_2, trc2] ] 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...