pandas 通过条件创建新列并通过shift选择最大值

lf5gs5x2  于 12个月前  发布在  其他
关注(0)|答案(4)|浏览(100)

这是我的DataFrame:

import pandas as pd

df = pd.DataFrame(
    {
        'a': [10, 20, 30, 400, 50, 60],
        'b': [897, 9, 33, 4, 55, 65]
    }
)

字符串
这是我想要的输出,我想创建列c

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN


以下是所需的步骤:
a)查找df.a > df.b的行
B)从上面的行中比较a的值和b的前一个值。如果它大于前一个b的值,则将a放在c列中,否则将前一个b
举例来说:
a)符合df.a > df.b13
B)从行1中,20小于897,因此选择897。但是在行3中,400大于33,因此选择它。
这张图片阐明了这一点:


的数据
这是我尝试过的,但它不起作用:

df.loc[df.a > df.b, 'c'] = max(df.a, df.b.shift(1))

uemypmqf

uemypmqf1#

尝试:

mask = df.a > df.b
df.loc[mask, "c"] = np.where(df["a"] > df["b"].shift(), df["a"], df["b"].shift())[mask]

print(df)

字符串
打印:

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN

lsmd5eda

lsmd5eda2#

您可以使用np.maximumSeries.shift()获得具有适当移位的最大值,然后您可以使用np.where()使用NaN填充其余行:

df["c"] = np.where(
    df["a"] > df["b"],                     # If value in "a" > value in "b"
    np.maximum(df["a"], df["b"].shift(1)), # Use the max of "a" and shifted "b"
    np.nan                                 # Otherwise, fill with NaN
)
df

字符串
这将产生:

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN

qjp7pelc

qjp7pelc3#

另一个可能的解决方案:

df['c'] = np.where(df['b'].shift().gt(df['a']), df['b'].shift(), df['a'])
df['c'] = df['c'].where(df['a'].gt(df['b']))

字符串
输出量:

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN

ryhaxcpt

ryhaxcpt4#

验证码

使用面具和滚动

cond = df['a'] > df['b']
df.loc[cond, 'c'] = df['b'].mask(cond, df['a']).rolling(2).max()

字符串
DF

a    b      c
0   10  897    NaN
1   20    9  897.0
2   30   33    NaN
3  400    4  400.0
4   50   55    NaN
5   60   65    NaN

相关问题