按组合并并重新格式化长格式数据框为宽格式。

5
我有以下数据框。描述每个用户所居住的城市。
       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

非常感谢你!
2个回答

5

这里有一种方法

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

4
你可以按照以下方式执行:
  1. 检索按Name分组的累积计数。为了使标题格式按要求进行格式化,对获得的结果值加1,因为它从0开始分配组而不是从1开始。使用map将这些字符串格式化为在其开头添加"City"字符。
  2. Name与上述获得的结果一起设置为索引轴,并使用unstack来展开DF。此外,可以使用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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接