Groupby和reshape long to wide format dataframe

时间:2017-02-14 16:59:29

标签: python pandas dataframe bigdata

我有以下DataFrame。描述每个用户所居住的城市

       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

非常感谢!

2 个答案:

答案 0 :(得分:2)

您可以通过以下方式执行此操作:

  1. 检索在名称上分组的累计计数。要根据需要格式化标题,请在获得的结果值中添加1,因为它开始从0开始分配组而不是1开始。使用map通过在这些字符串的开头添加"City"字符来格式化字符串。
  2. 名称与上面获得的结果一起设为索引轴,unstack设为DF。此外,使用None参数NaN可以替换fill_value值。
  3. 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

答案 1 :(得分:1)

这里有一种方式

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