python – 如何按列分组并将组中的所有值复制到pandas中的一行?

这是我的数据集的示例:

Consumer_num | billed_units  
29           | 984
29           | 1244
29           | 2323
29           | 1232
29           | 1150
30           | 3222
30           | 1444
30           | 2124

我想按consumer_num分组,然后将每个组的所有值(billed_units)添加到新列中.所以我需要的输出:

Consumer_num | month 1 | month 2 | month 3 | month 4  | month 5  
29           | 984     | 1244     | 2323    | 1232     | 1150 
30           | 3222    | 1444     | 2124    | NaN      | NaN

这是我到目前为止所做的:

group = df.groupby('consumer_num')['billed_units'].unique()
group[group.apply(lambda x: len(x)>1)]
df = group.to_frame()
print df

输出:

Consumer_num | billed_units  
29           | [984,1244,2323,1232,1150]
30           | [3222,1444,2124]

我不知道我的方法是否正确.如果它是正确的,那么我想知道如何将每个消费者的billed_units分开,然后添加到我在所需输出中显示的新列.或者有更好的方法来实现我所需的输出?

最佳答案 解

c = 'Consumer_num'
m = 'month {}'.format
df.set_index(
    [c, df.groupby(c).cumcount() + 1]
).billed_units.unstack().rename(columns=m).reset_index()

   Consumer_num  month 1  month 2  month 3  month 4  month 5
0            29    984.0   1244.0   2323.0   1232.0   1150.0
1            30   3222.0   1444.0   2124.0      NaN      NaN

这个怎么运作

>为方便起见,将’Consumer_num’放入变量c中
>为方便起见,将mapper函数放入变量m中
>使用两列设置​​索引以生成pd.MultiIndex

>我使用groupby和cumcount创建一个卸载级别
>然后我脱掉了

>最后使用mapper函数重命名列

回应评论

限制月数的一种方法是使用iloc.以下限制我们为3个月.你可以调整为第5名.Nans应该照顾好自己.

c = 'Consumer_num'
m = 'month {}'.format
df.set_index(
    [c, df.groupby(c).cumcount() + 1]
).billed_units.unstack().rename(columns=m).iloc[:, :3].reset_index()
#                                         ^..........^

   Consumer_num  month 1  month 2  month 3
0            29    984.0   1244.0   2323.0
1            30   3222.0   1444.0   2124.0

或者你可以预先处理

c = 'Consumer_num'
m = 'month {}'.format
d1 = df.groupby(c).head(3)  # pre-process and take just first 3
d1.set_index(
    [c, d1.groupby(c).cumcount() + 1]
).billed_units.unstack().rename(columns=m).reset_index()
点赞