我有一个看起来像这样的数据集:
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上的所有答案似乎都不起作用。
答案 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: