将重复的数据从行转换为列

时间:2018-11-01 06:53:54

标签: python pandas

我有类似的数据:

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_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 :(得分:0)

将您的对象转换成字典,名称作为键,而vals和trcs作为元组或列表中的连接值。

您想结束这样的事情:

yourDict[name] = [ [val_1, trc1] , [val_2, trc2] ] 

答案 1 :(得分:0)

使用:

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

答案 2 :(得分:0)

这里有一个使用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