首页 > 解决方案 > 将列的值与变量进行比较并创建新列

问题描述

我有一个这样的数据框:

           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”的新列:if block_no。= 1 并且如果 patch = 3 ,则 Rep_rate = 4 ,否则 Rep_rate = 0。

我试过这样做:

if (df_last['Block_No.']) == 1:
            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.']) == 2:
                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().


   

标签: pythonpandasdataframegroup-byvalueerror

解决方案


我不明白您用来填充 RR 列的逻辑,但一种方法可能是:

df['RR'] = 0
if (df['Block'] == 1).all():
    for i, row in df.iterrows():
        if row['Patch'] == 3:
            df.loc[i,'RR'] = 4 # note using df.loc to directly edit the dataframe
elif (df['Block'] == x).all():
    for i, row in df.iterrows():
        if row['Patch'] == y:
            df.loc[i,'RR'] = z
# more if statements as needed

用您需要的任何值替换xy和。z

您遇到的问题是if df["Block"] == 1. df["Block"] == 1对于Series 中的每个值是否等于 1 ,代码会生成 True/False 布尔 Series。不支持对 Series 使用 if 语句,因为含义不明确。Pandas 提供ser.any()ser.all()用于明确的布尔评估。例如

if (df["Block"] ==1).all():
    # more code ...

if如果 Block 列中的所有值都等于 1,则将评估语句中的代码。


推荐阅读