当前位置: 首页 > 知识库问答 >
问题:

在数据帧上使用groupby添加任意数量的列并计算值[重复]

袁何平
2023-03-14

我有一个熊猫DataFrame,我想通过使用Groupby并根据小时时间增量添加任意数量的列,并从第三列填充数据,将其转换为时间表(出于可视化目的)。

源数据帧可能如下所示:

ID  Hour Floor          
Jay  2     34       
Jay  3     34   
Tim  0     36  
Tim  1     34
Tim  2     36
Tom  3     32
Tom  4     36
Rob  3     31
Rob  4     32
Rob  5     33
Rob  6     34
...

我的目标是:

ID  HOUR_0 HOUR_1 HOUR_2 HOUR_3 HOUR_4 HOUR_5 HOUR_6...
Jay   0      0      34      34      0      0      0
Tim   36     34     36      0       0      0      0
Tom   0      0      0       32      36     0      0
Rob   0      0      0       31      32     33     34

我无法得到的是(如果不使用循环手动构造),根据第一个数据帧中的唯一或小时范围添加任意数量的列(在groupby操作之后),然后根据第一个数据帧中的小时和楼层列计算每个列的值。

有什么想法吗?

共有3个答案

闻人栋
2023-03-14

您正在查找unstack()。但首先我们需要设置索引()

df = df.set_index(['ID','Hour']).unstack(fill_value=0).add_prefix('HOUR_')
df.columns = df.columns.get_level_values(1)

或者按照温家宝的建议使用pivot:

df = (df.pivot(index='ID', columns='Hour', values='Floor')
        .fillna(0)
        .astype(int)
        .add_prefix('HOUR_'))

完整示例:

import pandas as pd

data = '''\
ID  Hour Floor          
Jay  2     34       
Jay  3     34   
Tim  0     36  
Tim  1     34
Tim  2     36
Tom  3     32
Tom  4     36
Rob  3     31
Rob  4     32
Rob  5     33
Rob  6     34'''

# Recreate dataframe
df = pd.read_csv(pd.compat.StringIO(data), sep='\s+')

# Apply solution
df = df.set_index(['ID','Hour']).unstack(fill_value=0).add_prefix('HOUR_')
df.columns = df.columns.get_level_values(1)

Df现在是:

     HOUR_0  HOUR_1  HOUR_2  HOUR_3  HOUR_4  HOUR_5  HOUR_6
ID                                                         
Jay       0       0      34      34       0       0       0
Rob       0       0       0      31      32      33      34
Tim      36      34      36       0       0       0       0
Tom       0       0       0      32      36       0       0
袁河
2023-03-14

这是简单的支点吗?

df.pivot(*df.columns).fillna(0).add_prefix('Hour_')
Out[71]: 
Hour  Hour_0  Hour_1  Hour_2  Hour_3  Hour_4  Hour_5  Hour_6
ID                                                          
Jay      0.0     0.0    34.0    34.0     0.0     0.0     0.0
Rob      0.0     0.0     0.0    31.0    32.0    33.0    34.0
Tim     36.0    34.0    36.0     0.0     0.0     0.0     0.0
Tom      0.0     0.0     0.0    32.0    36.0     0.0     0.0
颜鸿云
2023-03-14

因为我不禁要展示这是如何与pd.factorize一起工作的

i, r = pd.factorize(df.ID)
j, c = pd.factorize(df.Hour, sort=True)
b = np.zeros((r.size, c.size), df.Floor.dtype)

b[i, j] = df.Floor.values

d = pd.DataFrame(b, r, [f'Hour_{h}' for h in c])

d

     Hour_0  Hour_1  Hour_2  Hour_3  Hour_4  Hour_5  Hour_6
Jay       0       0      34      34       0       0       0
Tim      36      34      36       0       0       0       0
Tom       0       0       0      32      36       0       0
Rob       0       0       0      31      32      33      34
 类似资料:
  • 我有一个现有的dataframe,我需要在其中添加一个额外的列,该列的每一行都包含相同的值。 现有df: 新df: 我知道如何附加现有的series/dataframe列。但这是另一种情况,因为我只需要添加“Name”列,并将每一行设置为相同的值,在本例中为“abc”。

  • 问题内容: 我觉得有比这更好的方法: 为达到这个: 有没有一种方法可以避免回调? 问题答案: 使用,请参阅此处的文档 如果要从1开始订购

  • 我有一个pandas数据帧,如下所示: 我希望将第0行添加到数据帧的末尾,并获得如下所示的新数据帧: 我在熊猫身上能做什么来做到这一点?

  • 我有以下数据帧 并且,我试图通过对奖牌分组,得到“数字”和“年龄”的平均值。我可以用两条线做,但是如何用熊猫Groupby单线做。 我可以一次做一个手术 或者 然后可能合并,这是一个漫长的过程。那么如何以这种方式实现呢 下面是所需的输出

  • 我有一个数据集 我希望能够返回像(显示独特的值和频率)这样的东西

  • 问题内容: 我认为这是一个非常基本的问题,但我似乎找不到解决方案。 我有一个类似于以下内容的熊猫数据框: 它创建一个像这样的表: 我正在尝试创建一个表,该表表示该数据帧中不同值的数量。所以我的目标是这样的: 但是,我找不到正确的功能来实现这一目标。我试过了: 这将产生一个具有3行(按预期)但没有“ count”列的表。我不知道如何在该计数栏中添加。有人可以指出我正确的方向吗? 问题答案: 您可以使