一种将一个分类分布映射到另一个分类分布的算法?

时间:2018-09-18 19:23:11

标签: python pandas logic distribution pandas-groupby

前几天,我遇到了一个我认为简单的问题:鉴于实体(在这种情况下为公司)的数量,我想将一个类别的分布投影到另一个类别上。例如,这是两个类别:

     60%       40%
|----A1----|---A2---|
|---B1---|----B2----|
    40%       60%

在上文中,类别A代表“雇员人数”,类别B代表“年度销售额”。每个类别对相同人口进行切片/分组的方式都不相同,因此,“ A”类公司的总数等于所有“ B”类公司的总数。

因为类别A1大于类别B1,所以我的想法是获得加权平均值,例如:“取B1的2/3(40%/ 60%)和B2的1/3(其余)”。在上面的示例中,如果B1的收入为1,500美元,B2的收入为3,000美元,则类别A1的平均值为2,000美元(即(2/3)* $ 1,500 +(1/3)* $ 3,000)。而对于A2类,收入将仅为3,000美元。

尽管我不能弄清楚如何以可扩展到“ n”个类别并涵盖所有情况的方式对此进行编码,但该警告了。我最终使用的方法是通过“计数”(我找到了here,btw)对每个数据框进行充气,使用行索引进行联接,然后取平均值。我知道这可以归结为加权平均问题,但我无法解决。

这是我的示例Python / Pandas代码:

import pandas as pd

d_A = {'Cat_A_Name': ['A1', 'A2'], 'Cat_A_Empl': [2, 5], 'Cat_A_Counts': [60, 40]}
d_B = {'Cat_B_Name': ['B1', 'B2'], 'Cat_B_Rev': [1500, 3000], 'Cat_B_Counts': [40, 60]}

df_A = pd.DataFrame(data=d_A)
df_B = pd.DataFrame(data=d_B)

# For each dataframe, do a row-expansion by count (and then drop that count column)
df_A = df_A.loc[df_A.index.repeat(df_A['Cat_A_Counts'].astype('int'))].reset_index(drop=True)
df_A.drop({'Cat_A_Counts'}, axis=1, inplace=True)
df_B = df_B.loc[df_B.index.repeat(df_B['Cat_B_Counts'].astype('int'))].reset_index(drop=True)
df_B.drop({'Cat_B_Counts'}, axis=1, inplace=True)

# Then join by index, take the average by Cat_A_Name, and drop duplicate rows
df_All = df_A.join(df_B)
df_All['Avg_Cat_B_Rev'] = df_All.groupby('Cat_A_Name')['Cat_B_Rev'].transform(pd.Series.mean)
df_All.drop_duplicates(subset='Avg_Cat_B_Rev', inplace=True)

print(df_A.head())
print(df_B.head())
print(df_All)

是否有更优雅的解决方案? 理想情况下,我将能够使用考虑到适当类别的加权平均值。

0 个答案:

没有答案