2017-02-14 65 views
2

我有以下DataFrame。描述每个用户居住的城市Groupby并重新整形为宽格式的数据帧

 City  Name 
0 Seattle Alice 
1 Seattle  Bob 
2 Portland Mallory 
3 Seattle Mallory 
4 Memphis  Bob 
5 Portland Mallory 

你可以用熊猫达到以下目的吗?

 Name  City1 City2 City3 
0 Alice  Seattle NaN  Nan 
1 Bob  Seattle Memphis Nan 
2 Mallory Portland Seattle Portland 

非常感谢!

回答

1

Here'e单程

In [619]: df.groupby('Name')['City'].apply(list).apply(pd.Series) 
Out[619]: 
       0  1   2 
Name 
Alice  Seattle  NaN  NaN 
Bob  Seattle Memphis  NaN 
Mallory Portland Seattle Portland 

列名,使用renameformat

In [628]: (df.groupby('Name')['City'].apply(list).apply(pd.Series) 
      .rename(columns=lambda x: 'City{}'.format(x+1))) 
Out[628]: 
      City1 City2  City3 
Name 
Alice  Seattle  NaN  NaN 
Bob  Seattle Memphis  NaN 
Mallory Portland Seattle Portland 
1

您可以通过以下方式做到这一点:

  1. 检索的累积计数分组在名称。要根据需要格式化标题,请在得到的结果值中加1,因为它开始分配从0到1的组。使用map通过在这些字符的开头添加"City" char来格式化字符串。
  2. 用上述得到的结果作为索引轴和unstackDF沿着设置名称。此外,使用fill_value参数,None值可由NaN取代。

cc = df.groupby('Name')['City'].cumcount().add(1).map('City{}'.format) 
df.set_index(['Name', cc])['City'].unstack(fill_value=np.nan).reset_index() 

enter image description here

相关问题