如何根据 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
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