Pandas:使用其他列按条件更改列

dxpyg8gm  于 2023-04-04  发布在  其他
关注(0)|答案(2)|浏览(140)

我有这个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。
有什么办法可以轻松解决这个问题吗?

d5vmydt9

d5vmydt91#

使用布尔索引和map。对于随机数,可以利用numpy.random.uniform(或任何其他函数,取决于所需的分布):

import numpy as np

scalar = 0.5

mask_D = df['Beta'].eq('D')
mask_F = df['Beta'].eq('F')

df.loc[mask_D, 'Value'] = (df.loc[mask_D, 'Alpha']
                            .map(df[mask_F].set_index('Alpha')['Value'])
                            .mul(scalar*np.random.uniform(0.95, 1.05, size=mask_D.sum()))
                         )

输出:

Alpha Beta  Value
0     A    C      1
1     A    D      2
2     A    E      3
3     A    F      4
4     B    C      7
5     B    D      2
6     B    E      5
7     B    F      1
zwghvu4y

zwghvu4y2#

您的代码尝试将pd.Series分配给Value列的单个单元格,而它应该分别分配单个值(根据您的意图)。访问原始values,如下所示:

df.loc[mask & (df['Beta'] == 'D'), 'Value'] = (df.loc[mask & (df['Beta'] == 'F'), 'Value']
                                               * 0.5 * random.uniform(0.95, 1.05)).values

样本输出:

Alpha Beta     Value
0     A    C  1.000000
1     A    D  1.958938
2     A    E  3.000000
3     A    F  4.000000
4     B    C  7.000000
5     B    D  2.000000
6     B    E  5.000000
7     B    F  1.000000

相关问题