下面的代码可以简化对我问题的理解。我想创建一个概览表,为此,我将遍历“订单”列的所有唯一元素,为该列的每个唯一元素创建一个数据框,然后我将获得由每个代表的百分比.value_counts列中的“状态”列中的元素,然后将其保存到另一个数据框(这是我的概览表)中。
Overview_Table = pd.DataFrame()
for i, val in enumerate(df['Order'):
dfi = df.loc[df['Order']==val]
status = pd.DataFrame(dfi['Status Situation'].value_counts(normalize = True))
statusi.columns = ['Order: {}'.format(val)]
Overview_Table = pd.concat([Overview_Table, statusi], axis=1)
我面临的问题是,当我继续将值连接到Overview_Table时,这些值没有以相同的顺序连接。因此,我要寻找的是找出一种始终将状态数据框附加到Overview_Table数据框的方式。
我已经尝试使用.sort_index
,但是没有取得任何成功。此外,“订单”和“状态”列均为分类功能。
希望我能做到简洁明了。非常感谢您在此方面的帮助!也欢迎提出查询建议
答案 0 :(得分:1)
我认为*这就是您想要的。
创建一个具有顺序和状态以及一些随机数的随机数据集:
import pandas as pd
import random
order = [random.choice(['aa', 'bb', 'cc']) for _ in range(1000)]
status = [random.choice(['red', 'yellow', 'green']) for _ in range(1000)]
nums = [random.randint(1, 10) for _ in range(1000)]
df = pd.DataFrame({'order':order,
'status':status,
'value':nums})
按顺序和状态分组并求和:
g = df.groupby(['order', 'status']).agg({'value':'sum'}).reset_index(drop=False)
仅按顺序分组并对其值求和(以获得分母)
order_g = df.groupby('order')['value'].sum().reset_index(drop=False)
通过左连接来合并它们:
combined = pd.merge(g, order_g, on='order', how='left')
创建百分比(value_counts归一化):
combined['percentage'] = combined['value_x']/combined['value_y']
删除不需要的列:
combined.drop(['value_x', 'value_y'], axis=1, inplace=True)
没有您提供的实际数据集,也没有您对所寻找内容的期望,很难确定这一点,但我相信这就是您要寻找的内容。