【问题标题】: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
对于列名,使用rename 和format
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 添加到从 0 开始分配组时获得的结果值,而不是从 1 开始。使用
map 在字符串开头添加"City" char 来格式化字符串。
- 将 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()