真相含糊不清

时间:2019-06-07 11:32:32

标签: python pandas

我有一个看起来像这样的数据集:

ID      WEEK     TYPE     TYPE_ADJ
1038      1.0      1.0          1.0
1038     13.0      3.0          3.0
1038     26.0      3.0          3.0
1038     38.0      3.0          3.0
1038     52.0      3.0          3.0
1043      1.0      1.0          1.0
1043     13.0      2.0          2.0
1043     26.0      2.0          2.0
1043     38.0      3.0          3.0
1043     52.0      1.0          1.0

我想做的是,当TYPE = 3.0时,将TYPE_ADJ设为TYPE的最后一个非3.0值。即在上面的数据中将是:

ID      WEEK     TYPE     TYPE_ADJ
1038      1.0      1.0          1.0
1038     13.0      3.0          1.0
1038     26.0      3.0          1.0
1038     38.0      3.0          1.0
1038     52.0      3.0          1.0
1043      1.0      1.0          1.0
1043     13.0      2.0          2.0
1043     26.0      2.0          2.0
1043     38.0      3.0          2.0
1043     52.0      1.0          1.0

我尝试了以下代码:

for id in df.ID.unique():
    t = [1, 13, 26, 38, 52]
    for n in [0, 1, 2, 3]:
        prior_type = df.loc[(df.ID == id) & (df.WEEK == t[n]), 'TYPE']
        if (df.loc[((df.ID == id) & (df.WEEK == t[n + 1])), 'TYPE'] == 3):
            df.loc[(df.ID == id) & (df.WEEK == t[n + 1]), 'TYPE_ADJ'] = prior_type

我收到以下错误:

  

ValueError:系列的真值不明确。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

我尝试添加空,布尔值,项目,任何和所有内容,但它不起作用,而且StackOverflow上的所有答案似乎都不起作用。

2 个答案:

答案 0 :(得分:1)

您可以使用以下代码来实现它:

df.loc[df["TYPE"] == 3, "TYPE_ADJ"] = None
df["TYPE_ADJ"].ffill(inplace=True)

该代码删除了TYPE_ADJ,其中TYPE等于3,然后用以前的所有非缺失值向前填充TYPE_ADJ

它采用的是TYPE而不是TYPE_ADJ的最后一个值,但是在您的示例中,它们是相同的。

答案 1 :(得分:1)

通过比较列的值而不是列(系列)本身,可以避免出现错误。

if df.loc[(df.ID == id) & (df.WEEK == t[n + 1]), 'TYPE'].values[0] == 3: