转换Pandas中列中的行

时间:2015-05-28 12:30:13

标签: python postgresql python-2.7 pandas

我正在努力将行转换为Pandas中的列,请查看下面的input data

 id match bookmaker home away  
  1  T1-T2 Bet365   1.5  2.4
  1  T1-T2 Bwin     1.6  2.2
  1  T1-T2 Betfair  1.7  2.3
  2  T1-T3 Bet365   1.2  2.9
  2  T1-T3 Bwin     1.2  2.8
  2  T1-T3 Betfair  1.1  3.0

我需要将其转换为new array

 id match  Bet365_home Bet365_away Bwin_home Bwin_away Betfair_home Betfair_away  
  1  T1-T2         1.5         2.4       1.6       2.2          1.7          2.3
  2  T1-T3         1.2         2.9       1.2       2.8          1.1          3.0 

如果您可以建议如何在PostgreSQL中完成,也会很酷!

2 个答案:

答案 0 :(得分:3)

我不知道SQL方法,但是在pandas中你想要pivot

In [233]:    
df.pivot(index='id', columns = 'bookmaker')

Out[233]:
           match                  home                away             
bookmaker Bet365 Betfair   Bwin Bet365 Betfair Bwin Bet365 Betfair Bwin
id                                                                     
1          T1-T2   T1-T2  T1-T2    1.5     1.7  1.6    2.4     2.3  2.2
2          T1-T3   T1-T3  T1-T3    1.2     1.1  1.2    2.9     3.0  2.8

答案 1 :(得分:2)

要按idmatch进行分组,您可以使用set_index。 如果您还将bookmaker添加到索引,然后unstack

import numpy as np
import pandas as pd

df = pd.read_table('data', sep='\s+')
df = df.set_index(['id', 'match', 'bookmaker']).unstack(['bookmaker'])

你会得到

            home                away             
bookmaker Bet365 Bwin Betfair Bet365 Bwin Betfair
id match                                         
1  T1-T2     1.5  1.6     1.7    2.4  2.2     2.3
2  T1-T3     1.2  1.2     1.1    2.9  2.8     3.0

hierarchical (MultiIndex) column

  home                away             
Bet365 Bwin Betfair Bet365 Bwin Betfair

的结构比平坦的单级列索引更多:

Bet365_home Bet365_away Bwin_home Bwin_away Betfair_home Betfair_away

它使homeaway的选择或分组比列索引不变更容易。总的来说,我认为它是DataFrame的更好格式。

但是,如果您想要一个扁平列索引:

df = df.swaplevel(0, 1, axis=1)
df = df.reindex(columns='Bet365 Bwin Betfair'.split(), level=0)
df.columns = ['{}_{}'.format(bet, hw)  for bet, hw  in df.columns]
pd.options.display.width = 100
print(df)

产量

          Bet365_home  Bet365_away  Bwin_home  Bwin_away  Betfair_home  Betfair_away
id match                                                                            
1  T1-T2          1.5          2.4        1.6        2.2           1.7           2.3
2  T1-T3          1.2          2.9        1.2        2.8           1.1           3.0