如何根据 pandas 中的另一列主值替换 <NA> 值

How to replace <NA> values based on another column main value in pandas

pandas

有问题

我有以下数据框:

      product code trends_vs  trends_100_0
1   aaaaaaa   it       150           100
6   aaaaaaa   pl      <NA>            90
11  aaaaaaa   ro      <NA>            82
15  aaaaaaa   sk      <NA>            13
21   bbbbb   ro       260           100
25   bbbbb   cz      <NA>            62
29   bbbbb   sk      <NA>            42

我想通过以下方式计算 trends_vs 列的值:

“产品”列中的每个产品只有一个 trends_vs 值对应于 trends_100_0 - 100 个值。

现在要获得第二行的 trends_vs 值,我们必须执行 150 * (90/100)

输出和逻辑应如下所示:

      product code trends_vs  trends_100_0
1   aaaaaaa   it       150           100
6   aaaaaaa   pl      135            90      ---> 150 * (90/100)
11  aaaaaaa   ro      123            82    ---> 150 * (82/100)
15  aaaaaaa   sk      19.5            13  ---> 150 * (13/100)
21   bbbbb   ro       260           100
25   bbbbb   cz      161.2            62  ---> 260 * (62/100) # 260 instead of 150 because its a different product 'bbbbb'
29   bbbbb   sk      109.2            42 ---> 260 * (42/100)

我尝试使用 groupby 或 map,但有些东西没有按预期工作。当每一列应该在一行中彼此对应时,我有一个解决方案,但在这种情况下,我们应该根据每个产品的一个主要价值进行计算?

使用 .groupby.transform 然后使用简单的 .mul.div

我们可以使用 .fillna 来定位您的行。

df["trends_vs"] = df["trends_vs"].fillna(
df.groupby("product")["trends_vs"]
.transform("min")
.mul((df["trends_100_0"].div(100)))
)


    product code  trends_vs  trends_100_0
1   aaaaaaa   it      150.0           100
6   aaaaaaa   pl      135.0            90
11  aaaaaaa   ro      123.0            82
15  aaaaaaa   sk       19.5            13
21    bbbbb   ro      260.0           100
25    bbbbb   cz      161.2            62
29    bbbbb   sk      109.2            4

这将允许您根据产品查找 trends_vs,并根据结果查找 trends_100_0

df['trends_vs'] = df.groupby('product')['trends_vs'].transform(max)
df['trends_vs'] = df['trends_vs'] * (df['trends_100_0']/100)
df

没有groupby的另一种方法:

df['trends_vs'] = (df.sort_values(['product', 'trends_100_0'])['trends_vs'].bfill()
                       * df['trends_100_0'] / 100)
print(df)

# Output
    product code  trends_vs  trends_100_0
1   aaaaaaa   it      150.0           100
6   aaaaaaa   pl      135.0            90
11  aaaaaaa   ro      123.0            82
15  aaaaaaa   sk       19.5            13
21    bbbbb   ro      260.0           100
25    bbbbb   cz      161.2            62
29    bbbbb   sk      109.2            42