我有这个dataframe在这里(抱歉的坏例子)
import pandas as pd
import random
df = pd.DataFrame({
"Alpha": ["A", "A", "A", "A", "B", "B", "B", "B"],
"Beta": ["C", "D", "E", "F", "C", "D", "E", "F"],
"Value": [1, 2, 3, 4, 7, 2, 5, 1],
})
我希望对于每个Alpha == A,具有“Beta”=“D”的行的“Value”应该是“Beta=“F”乘以随机数和标量的值。
mask = (df['Alpha'] == 'A')
df.loc[mask & (df['Beta'] == 'D'), 'Value'] = df.loc[mask & (df['Beta'] == 'F'), 'Value'] * 0.5 * random.uniform(0.95, 1.05)
两个loc函数都返回一系列相等长度的值(在其他更高级的例子中也是如此),但最终,Value在任何地方都变成了NaN。
有什么办法可以轻松解决这个问题吗?
2条答案
按热度按时间d5vmydt91#
使用布尔索引和
map
。对于随机数,可以利用numpy.random.uniform
(或任何其他函数,取决于所需的分布):输出:
zwghvu4y2#
您的代码尝试将
pd.Series
分配给Value
列的单个单元格,而它应该分别分配单个值(根据您的意图)。访问原始values
,如下所示:样本输出: