【问题标题】:How can we perform group by single column without aggregation in pandas?我们如何在 Pandas 中按单列执行分组而不进行聚合?
【发布时间】:2022-09-21 00:50:03
【问题描述】:

我有几个关于按功能分组的问题。1.我想按单列按熊猫数据框分组而不聚合。2.分组后,我想按月份日期将数据集分成几个数据集。 所以,我不能这样做,我请求帮助。如果你们能帮助我,我将不胜感激。 我在下面提供了代码、预期结果和数据集。

原始数据框

data = {'month': ['2022-01-01', '2022-02-01', '2022-03-01', '2022-01-01', '2022-02-01', '2022-03-01', '2022-01-01', '2022-02-01', '2022-03-01',], 
'Name': ['A', 'A', 'A', 'B', 'B', 'B', 'C', 'C', 'C'], 
'num': [1234, 1234, 1234, 456, 456, 456, 456, 100, 200,],
}

df = pd.DataFrame(data)
df

问题 #1 的预期结果

我想像这样将数据集拆分成不同的数据集问题 #2 的预期结果

谢谢你

【问题讨论】:

  • 如果您不打算进行任何聚合,那么分组的目的是什么?

标签: python pandas dataframe group-by data-science-experience


【解决方案1】:

IIUC,您可以使用列表理解和groupby

dfs = [d for _,d in df.groupby('month')]

输出:

[        month Name   num
 0  2022-01-01    A  1234
 3  2022-01-01    B   456
 6  2022-01-01    C   456,
         month Name   num
 1  2022-02-01    A  1234
 4  2022-02-01    B   456
 7  2022-02-01    C   100,
         month Name   num
 2  2022-03-01    A  1234
 5  2022-03-01    B   456
 8  2022-03-01    C   200]

然后您可以使用切片访问每个数据帧:

dfs[0]

        month Name   num
0  2022-01-01    A  1234
3  2022-01-01    B   456
6  2022-01-01    C   456

或者,将月份添加到索引以形成 MultiIndex:

df2 = df.set_index(df['month'], append=True).swaplevel().sort_index()

输出:

                   month Name   num
month                              
2022-01-01 0  2022-01-01    A  1234
           3  2022-01-01    B   456
           6  2022-01-01    C   456
2022-02-01 1  2022-02-01    A  1234
           4  2022-02-01    B   456
           7  2022-02-01    C   100
2022-03-01 2  2022-03-01    A  1234
           5  2022-03-01    B   456
           8  2022-03-01    C   200

然后使用loc 获取子数据帧:

df2.loc['2022-01-01']

        month Name   num
0  2022-01-01    A  1234
3  2022-01-01    B   456
6  2022-01-01    C   456

【讨论】:

  • @BadCoder 哪一个?
  • 第一个解决方案,但我没有尝试过第二个解决方案,它可能也可以。当我打印单个数据集时,它会打印在一个数据框中,但是如果我运行一个循环,它将以不同的格式打印并且难以阅读。这是为什么?
【解决方案2】:

尝试:

df.sort_values(['month', 'Name'])
    month       Name    num
0   2022-01-01  A       1234
3   2022-01-01  B       456
6   2022-01-01  C       456
1   2022-02-01  A       1234
4   2022-02-01  B       456
7   2022-02-01  C       100
2   2022-03-01  A       1234
5   2022-03-01  B       456
8   2022-03-01  C       200

D = []
for i in df['month'].unique():
    print(i)
    D.append(df.loc[df['month'].eq(i)])

#D is now list of separate dataframes

D[0]
    month       Name    num
0   2022-01-01  A       1234
3   2022-01-01  B       456
6   2022-01-01  C       456

D[1]
    month       Name    num
1   2022-02-01  A       1234
4   2022-02-01  B       456
7   2022-02-01  C       100

type(D[2])
pandas.core.frame.DataFrame

#-----
if you want to sort by only one column, then you need to create this one column as string:
df['monthName'] = df['month'] + df['Name']
df.sort_values('monthName')
    month       Name    num     monthName
0   2022-01-01  A       1234    2022-01-01A
3   2022-01-01  B       456     2022-01-01B
6   2022-01-01  C       456     2022-01-01C
1   2022-02-01  A       1234    2022-02-01A
4   2022-02-01  B       456     2022-02-01B
7   2022-02-01  C       100     2022-02-01C
2   2022-03-01  A       1234    2022-03-01A
5   2022-03-01  B       456     2022-03-01B
8   2022-03-01  C       200     2022-03-01C

you can drop this column as long as you sort:
df.sort_values('monthName').drop(columns='monthName')

#-------
if you want to read all the dataframes at once in jupyter:

for i in D:
    print(i)
   month         Name   num
0  2022-01-01    A      1234
3  2022-01-01    B       456
6  2022-01-01    C       456
   month         Name   num
1  2022-02-01    A      1234
4  2022-02-01    B       456
7  2022-02-01    C       100
   month         Name   num
2  2022-03-01    A      1234
5  2022-03-01    B       456
8  2022-03-01    C       200

to make it more easy to read them, you can also add a line or an empty line after each one:

for i in D:
    print(i)
    print('
') #add empty line after each df
    #print('__________
') #add line + empty line after each df

        month Name   num
0  2022-01-01    A  1234
3  2022-01-01    B   456
6  2022-01-01    C   456


        month    Name   num
1  2022-02-01    A      1234
4  2022-02-01    B       456
7  2022-02-01    C       100


        month    Name   num
2  2022-03-01    A      1234
5  2022-03-01    B       456
8  2022-03-01    C       200

[![screenshot][1]][1]

【讨论】:

  • 谢谢你的解决方案。 #1 在这种情况下,排序解决了这个问题,但是如果我们只想在 Pandas 中像 SQL 一样按单列分组,我们该怎么做呢?
  • 我们不需要分组,我们需要排序,如果您需要按一列排序,您应该将两列作为字符串连接然后排序,我会将其添加到我的答案中
  • 谢谢你的解决方案。不,我们不需要合并,我认为 sort 可以解决问题。我们如何将列表转换为数据框?如果我们可以将它们放在数据框中,它将是一种更易读的格式。
  • 你的意思是许多数据框的列表D
  • 是的,哈立德。拥有一个列表很难读取和操作大型数据集。所以,我想知道是否可以将它们放在数据框中。
猜你喜欢
  • 1970-01-01
  • 2019-01-10
  • 1970-01-01
  • 1970-01-01
  • 2019-10-12
  • 1970-01-01
  • 2020-03-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多