在Pandas DataFrame上使用groupby添加任意数量的列并计算值

时间:2018-04-09 17:22:37

标签: python pandas pandas-groupby

我有一个pandas DataFrame我想通过使用groupby转换成时间表(用于可视化目的),并根据小时时间增量添加任意数量的列,并填充第3列中的数据。

源DataFrame可能如下所示:

UPDATE ApplicationEntity
SET jsonData = REPLACE(jsondata, 'None', 'google')
WHERE jsonData LIKE '%"gla":"None"%'

我的目标是:

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
...

我无法获得(没有手动构建此循环)是根据第一个DataFrame中的唯一或小时范围添加任意数量的列(在groupby操作之后),然后根据每个列值计算每个列值在第一个DataFrame的Hour和Floor列上。

有什么想法吗?

3 个答案:

答案 0 :(得分:3)

因为我无法帮助,但展示了如何使用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

答案 1 :(得分:3)

这是一个简单的转折点吗?

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

答案 2 :(得分:2)

您正在寻找set_index()。但首先我们需要df = df.set_index(['ID','Hour']).unstack(fill_value=0).add_prefix('HOUR_') df.columns = df.columns.get_level_values(1)

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

或者按照Wen的建议使用数据透视:

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)

完整示例:

     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

Df现在是:

 res.setHeader("Content-Disposition",
                "anything; filename=\"" + file.getName() + "\";");