Python 如何按列分组并将组的所有值复制到表中的一行?

Python 如何按列分组并将组的所有值复制到表中的一行?,python,pandas,Python,Pandas,这是我的数据集示例: Consumer_num | billed_units 29 | 984 29 | 1244 29 | 2323 29 | 1232 29 | 1150 30 | 3222 30 | 1444 30 | 2124 我想按消费者数量分组,然后将每个组的所有值(账单单位)添加到新列中。因此,我需要的输出: Cons

这是我的数据集示例:

Consumer_num | billed_units  
29           | 984
29           | 1244
29           | 2323
29           | 1232
29           | 1150
30           | 3222
30           | 1444
30           | 2124
我想按消费者数量分组,然后将每个组的所有值(账单单位)添加到新列中。因此,我需要的输出:

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]
我不知道我的方法是否正确。如果它是正确的,那么我想知道如何分离每个消费者的计费单位,然后添加到新列中,如我在所需输出中所示。还是有更好的方法来实现我所需的输出?

解决方案

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
它的工作原理

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
  • 为方便起见,将映射器函数放入变量
    m
  • 设置带有两列的索引以生成一个
    pd.MultiIndex
    • 我使用
      groupby
      cumcount
      创建一个级别,以便使用
    • 然后I
      unstack
  • 最后,使用mapper函数重命名列

对评论的回应

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
限制月数的一种方法是使用
iloc
。以下将我们的期限限制为3个月。你可以调整到前5个。南部人应该照顾好自己

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()

您可以像这样使用
pivot

In [70]: dfm = df.assign(m=df.groupby('Consumer_num').cumcount().add(1))

In [71]: dfm.pivot('Consumer_num', 'm', 'billed_units').add_prefix('month ')
Out[71]:
m             month 1  month 2  month 3  month 4  month 5
Consumer_num
29              984.0   1244.0   2323.0   1232.0   1150.0
30             3222.0   1444.0   2124.0      NaN      NaN

细节

In [75]: df
Out[75]:
   Consumer_num  billed_units
0            29           984
1            29          1244
2            29          2323
3            29          1232
4            29          1150
5            30          3222
6            30          1444
7            30          2124

In [76]: dfm
Out[76]:
   Consumer_num  billed_units  m
0            29           984  1
1            29          1244  2
2            29          2323  3
3            29          1232  4
4            29          1150  5
5            30          3222  1
6            30          1444  2
7            30          2124  3

非常感谢它成功了。我只有一个问题,现在有些消费者有7个月的数据,有些少于5个月,等等,我想把它限制到5个月。如果消费者没有5,我想用Nan填充列,否则我只想添加前5个。我该怎么做?@BinoyJ我已经添加了一些可行的解决方案,这正是我想要的。谢谢你@piRSquared:)@BinoyJ很高兴我能帮上忙。