【问题标题】:Creating a new column based on a condition gives an error根据条件创建新列会出错
【发布时间】:2021-09-30 17:58:45
【问题描述】:

我有一个这样的数据框:

           Patch  Last reward  First reward  Difference    Name  Block_No.
group_id                                                                 
1             3          0.0           0.0         0.0  XYZ          1
2             4         43.0          54.0        11.0  XYZ          1
3             5          0.0           0.0         0.0  XYZ          2
4             6         40.0          65.0        25.0  XYZ          2
5             7          0.0           0.0         0.0  XYZ          3
6             0          0.0           0.0         0.0  XYZ          3

我想根据以下条件创建一个名为“Rep_rate”的新列: 如果block_no。 = 1 那么如果 patch = 3 , Rep_rate = 4 ,否则 Rep_rate = 0。

我试过这样做:

if (df_last['Block_No.']) == 0:
            for i in range (len(df_last)):
                if df_last['Patch'][i] == 1: 
                    rep = 8
                else:
                    rep = 0
                df_last['Rep_Rate'] = rep

if (df_last['Block_No.']) == 1:
                for i in range (len(df_last)):
                    if df_last['Patch'][i] == 1: 
                        rep = 4
                    else:
                        rep = 0
                    df_last['Rep_Rate'] = rep

 if (df_last['Block_No.']) == 3:
                for i in range (len(df_last)):
                    if df_last['Patch'][i] == 1: 
                        rep = 8
                    else:
                        rep = 0                            
                    df_last['Rep_Rate'] = rep

但是当我尝试这个时,我得到以下错误:

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().


   

【问题讨论】:

    标签: python python-3.x pandas dataframe valueerror


    【解决方案1】:

    尝试通过布尔掩码和 loc 访问器:

    m=(df['Block_No.'].eq(1)) & (df['Patch'].eq(3))
    df.loc[m,'Rep_Rate']=4
    df.loc[~m,'Rep_Rate']=0
    

    通过 numpy 的 where() 方法:

    #import numpy as np
    
    m=(df['Block_No.'].eq(1)) & (df['Patch'].eq(3))
    df['Rep_Rate']=np.where(m,4,0)
    

    【讨论】:

    • 我可以将它用于多个补丁吗?像 df['patch'].eq(3,4,5) ?类似的东西?
    • 如果我将它用于多个补丁它不起作用。
    • @Kshtj 然后将您的条件放入您的问题中......然后我将相应地更改答案
    【解决方案2】:

    试试

    for x in df_last['Block_No.']
        if x == condition:
    

    错误可能是因为您将系列与数字进行比较,

    【讨论】:

      猜你喜欢
      • 2020-12-21
      • 2020-10-02
      • 1970-01-01
      • 2021-11-04
      • 2016-08-16
      • 2021-06-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多