熊猫数据帧按权重划分的一行值

问题描述 投票:0回答:4

这似乎是一个基本问题,但是一种巧妙的解决方案使我逃脱了。

我有一个pandas数据框,其中所有值都分配为一行。但是,我需要按权重将值划分为多行。此处的示例:

输入数据框:

import pandas as pd

# starting df with weights W.
df_input = pd.DataFrame({
    'W': [0.3, 0.2, 0.5],
    'X1': [100, 0, 0],
    'X2': [150, 0, 0],
    'X3': [200, 0, 0],
    'X4': [300, 0, 0]
})

所需的输出数据帧:

df_output = pd.DataFrame({
    'W': [0.3, 0.2, 0.5],
    'X1': [30, 20, 50],
    'X2': [45, 30, 75],
    'X3': [60, 40, 100],
    'X4': [90, 60, 150]
})

屏幕截图:

enter image description here

python pandas dataframe split weighted
4个回答
0
投票

如果我理解正确,那只是一个简单的矩阵乘法。从(3,1)矩阵开始,再乘以(1,3)。最终结果将是(3,3)。让我知道这种解决方法是否有任何帮助:

import numpy as np
A = np.array([[3,6,7],[5,-3,0]])
B = np.array([[1,1],[2,1],[3,-1]])
C = A.dot(B)
print (C)

Output:
[[36,-12],
 [-1,  2] 

0
投票

优雅主观-一种可能的方法是使用pd.clip

 for col in ['X1', 'X2', 'X3', 'X4']:
     df_input[col] = df_input[col].clip(lower=df_input[col].max())
     df_input[col]*=df_input['W']

结果将是上面的。


0
投票

使用数字广播:

df_output = df_input.copy()
df_output.loc[:, 'X1':] = df_output.loc[:, 'X1':] * df_output['W'].values[:, None]

如果您需要纯熊猫解决方案:

df_output.loc[:, 'X1':] = df_output.loc[:, 'X1':].apply(lambda col: col * df_output['W'])

0
投票

使用DataFrame.ffill填充列中的值,然后将它们乘以to_numpy的因数并重整矢量:

values = df_input.replace(0, np.NaN).ffill()
df_input.iloc[:, 1:] = values.iloc[:, 1:] * values['W'].to_numpy()[:, None]

     W    X1    X2     X3     X4
0  0.3  30.0  45.0   60.0   90.0
1  0.2  20.0  30.0   40.0   60.0
2  0.5  50.0  75.0  100.0  150.0
© www.soinside.com 2019 - 2024. All rights reserved.