【问题标题】:Groupby and reshape long to wide formatted dataframeGroupby 并重塑长到宽格式的数据框
【发布时间】:2017-02-14 16:59:29
【问题描述】:

我有以下数据框。描述每个用户居住的城市

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

你可以通过 pandas 实现以下目标吗?

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

非常感谢!

【问题讨论】:

    标签: python pandas dataframe bigdata


    【解决方案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
    

    【讨论】:

      【解决方案2】:

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

      1. 检索按名称分组的累积计数。要获得所需格式的标题,请将 1 添加到从 0 开始分配组时获得的结果值,而不是从 1 开始。使用map 在字符串开头添加"City" char 来格式化字符串。
      2. Name 与上面获得的结果一起设置为索引轴,并将unstack 设置为DF。此外,None 值可以使用fill_value 参数替换为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()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 2012-03-25
        • 2021-05-01
        相关资源
        最近更新 更多