【问题标题】:Python:对每一行进行排序并累积权重
【发布时间】:2022-01-23 05:19:15
【问题描述】:

我有以下数据框:

df1 = pd.DataFrame(
{
"A_price": [10, 12, 15],
"B_price": [20, 19, 29],
"C_price": [23, 21, 4],
"D_price": [45, 47, 44],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)

df2 = pd.DataFrame(
{
"A_weight": [0.1, 0.2, 0.4],
"B_weight": [0.2, 0.5, 0.1],
"C_weight": [0.3, 0.2, 0.1],
"D_weight": [0.4, 0.1, 0.4],
},
index = ['01-01-2020', '01-02-2020', '01-03-2020']
)

out = pd.merge(df1, df2, left_index=True, right_index=True)
out.columns = out.columns.str.split('_', expand=True)
out = out.sort_index(axis=1)
out:
            A               B               C               D
            price   weight  price   weight  price   weight  price   weight
01-01-2020  10      0.1     20      0.2     23      0.3     45      0.4
01-02-2020  12      0.2     19      0.5     21      0.2     47      0.1
01-03-2020  15      0.4     29      0.1     4       0.1     44      0.4

我想要做的是计算加权中位数,该中位数通过按 price 对(重量,价格)对进行排序,然后累积权重,直到跨越 50% 累积权重的两个价格点找到了。

然后我们在这两个(权重、价格)对之间进行插值,以找到累积权重为 50% 的价格,然后将该价格放入新的 DataFrame 中。

更新:我更改了我的数据框,因此它更能反映我目前拥有的内容。

我想要的输出将是每行的加权中位数。意思是,对于索引“01-01-2020”的行,我希望中位数是 price = 23 的插值,因为当您在行中添加权重时,我们有 0.1+0.2+0.3 > 0.5。所以我会得到一个如下所示的价格数据框:

df_prices:
             Price
01-01-2020   23
01-02-2020   19
01-03-2020   29

【问题讨论】:

  • 能否添加一个包含预期输出的示例数据框?
  • 为什么我们有两列 A 和 B?
  • 我更新了我的问题。本质上,最终数据框中的价格应该是每行按升序排序后跨越 50% 权重的两个价格的插值。

标签: python pandas dataframe aggregate-functions cumulative-sum


【解决方案1】:

IIUC:

def wmedian(sr):
    df = sr.unstack().sort_values('price')
    return df.loc[df['weight'].cumsum() > 0.5, 'price'].iloc[0]

out2 = out.apply(wmedian, axis=1)
print(out2)

# Output:
01-01-2020    23.0
01-02-2020    19.0
01-03-2020    29.0
dtype: float64

https://en.wikipedia.org/wiki/Weighted_median

【讨论】:

  • 我更新了我的问题。我明白你所做的,但是,我想做同样的事情,但跨行而不是列。我尝试编辑您的代码以计算整个行的重量中位数,但这不起作用。需要做哪些改变?
  • @MathMan99。我更新了我的答案。请检查一下好吗?
  • 我相信它适用于我的原始数据框。我将手动检查一些条目,但这可能需要一些时间,因为它非常大。一旦我核实,我会接受你的回答。谢谢你的帮助
  • @MathMan99。我的解决方案不起作用?
  • 我想我找到了问题所在。将>= 0.5 替换为> 0.5
猜你喜欢
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 2013-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多