pandas:按列分组,并将计算的重复列添加到新数据帧

时间:2017-10-27 15:32:32

标签: python pandas dataframe

我有一个像这样的数据框

Page KeyWord date
1    hello   mon
1    good    mon
2    holy    tues
2    brown   wed
2    crazy   wed

需要输出数据帧

Page KeyWord_1 KeyWord_2 KeyWord_3 date_1 date_2 date_3
1    hello     good      NULL      mon    mon    NULL
2    holy      brown     crazy     tues   wed    wed

基本上数据框应该添加足够的列来满足最大数量的重复页码,所以在上面的例子中,我们看到有3个重复的页面(第3页有3个实例)所以它应该添加许多编号除了groupby列之外的重复列。

只是为了展示另一个例子

输入:

Page KeyWord date
1    hello   mon
1    good    mon
2    holy    tues
2    brown   wed

输出:

Page KeyWord_1 KeyWord_2 date_1 date_2 
1    hello     good      mon    mon   
2    holy      brown     tues   wed    

3 个答案:

答案 0 :(得分:1)

一种方式,转到MultiIndex:

cleanup: true

如果确实需要,您可以将列展平:

In [11]: res = df.pivot_table(index="Page", columns=df.groupby("Page").cumcount(), aggfunc="first")

In [12]: res
Out[12]:
     KeyWord                date
           0      1      2     0    1     2
Page
1      hello   good   None   mon  mon  None
2       holy  brown  crazy  tues  wed   wed

答案 1 :(得分:1)

df['new']=df.groupby('Page').cumcount().add(1)
df=df.set_index(['Page','new']).unstack()
df.columns=df.columns.map('{0[0]}_{0[1]}'.format)

Out[870]: 
     KeyWord_1 KeyWord_2 KeyWord_3 date_1 date_2 date_3
Page                                                   
1        hello      good      None    mon    mon   None
2         holy     brown     crazy   tues    wed    wed

答案 2 :(得分:0)

您可以使用pivot_table功能来实现此目的。下面的代码将为您完成工作:

import pandas as pd
df = pd.DataFrame([
[1, "hello", "mon"],
[1, "good", "mon"],
[2, "holy", "tues"],
[2, "brown", "wed"],
[2, "crazy", "wed"]])
df.columns = ["Page", "KeyWord", "date"]

df_out = pd.pivot_table(df, index="Page", values = ["KeyWord","date"], columns = df.groupby(['Page']).cumcount()+1, aggfunc="first")
df_out.columns = [key + "_" + str(date) for key, date in df_out.columns]

因此,如果您的原始DataFrame是:

>>> df
   Page KeyWord  date
0     1   hello   mon
1     1    good   mon
2     2    holy  tues
3     2   brown   wed
4     2   crazy   wed

然后df_out将是:

>>> df_out
     KeyWord_1 KeyWord_2 KeyWord_3 date_1 date_2 date_3
Page                                                   
1        hello      good      None    mon    mon   None
2         holy     brown     crazy   tues    wed    wed