我有一个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列上。
有什么想法吗?
答案 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() + "\";");