在每行中应用逻辑比应用lambda更快吗?

2024-10-01 07:13:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个df:

dfs = """
    contract Valindex0  RB  Valindex1
2   A00118  51  0   50
3   A00118  42  1   47
4   A00118  44  1   47

"""
df = pd.read_csv(StringIO(dfs.strip()), sep='\s+')

df:

  contract  Valindex0  RB  Valindex1
2   A00118         51   0         50
3   A00118         42   1         47
4   A00118         44   1         47

我想在df['Valindex']的每一行中添加一个新列

此列值为

 df['Valindex0']

 df['Valindex1']

这取决于df['RB']:

if df['RB']==0:
   df['Valindex'] = df['Valindex0']
elif df['RB']==1:
  df['Valindex'] = df['Valindex1']  

现在我正在使用apply lambda,但速度非常慢:

df['Valindex'] = df.apply(
    lambda df: df["Valindex" + str(df["RB"])], axis=1)

输出应如下所示:

    contract    Valindex0   RB  Valindex1   Valindex
2   A00118            51    0   50          51
3   A00118            42    1   47          47
4   A00118            44    1   47          47

有没有更快的办法


Tags: csvlambdadfreadpdapplystripcontract
3条回答

让我们试试看

df['Valindex'] = df['Valindex0']

df.loc[df.RB==1,'Valindex'] = df['Valindex1']

使用^{}

df["Valindex"] = np.where(df["RB"].eq(0), df["Valindex0"], df["Valindex1"])

^{}用于多种情况和条件:

conditions = [df["RB"].eq(0), df["RB"].eq(1)]
labels = [df["Valindex0"], df["Valindex1"]]
df["Valindex"] = np.select(conditions, labels)

df的输出:

    contract    Valindex0   RB  Valindex1   Valindex
2   A00118      51          0   50          51
3   A00118      42          1   47          47
4   A00118      44          1   47          47

你可以试试^{}

df["Valindex"] = df["Valindex0"].where(df["RB"].eq(0), df["Valindex1"])


  contract  Valindex0  RB  Valindex1  Valindex
2   A00118         51   0         50        51
3   A00118         42   1         47        47
4   A00118         44   1         47        47

相关问题 更多 >