[英]pandas numpy mask filter not working as expected
我有一个 dataframe,您可以通过运行以下代码来获得它:
import numpy as np
import pandas as pd
from io import StringIO
df4s = """
LowerAge age 1 2 3 4
0 2 3 o.234 o.234 o.234 o.234
1 3 4 o.234 o.234 o.234 o.234
2 4 2 o.234 o.234 o.234 o.234
3 5 3 o.234 o.234 o.234 o.234
"""
df4 = pd.read_csv(StringIO(df4s.strip()), sep='\s+')
df4
输出是:
LowerAge age 1 2 3 4
0 2 3 o.234 o.234 o.234 o.234
1 3 4 o.234 o.234 o.234 o.234
2 4 2 o.234 o.234 o.234 o.234
3 5 3 o.234 o.234 o.234 o.234
现在逻辑是这样的:对于每一行,如果LowerAge-1 < age,则df4[str(LowerAge-1)] =1,否则保持不变,例如:
在第一行,LowerAge-1 等于 1 并且小于 age,那么列 '1' 的值(因为 LowerAge-1 等于 1)将等于 1,
在第二行,LowerAge-1 等于 2 并且小于 age,那么列 '2' 的值将等于 1。
理想的 output 应该是:
LowerAge age 1 2 3 4
0 2 3 1 o.234 o.234 o.234
1 3 4 o.234 1 o.234 o.234
2 4 2 o.234 o.234 o.234 o.234
3 5 3 o.234 o.234 o.234 o.234
我的代码是:
index_age = df4['LowerAge']-1
mask=index_age < df4['age']
df4.loc[mask, index_age.astype(str)]=1
我的 output:
LowerAge age 1 2 3 4
0 2 3 1 1 1 1
1 3 4 1 1 1 1
2 4 2 o.234 o.234 o.234 o.234
3 5 3 o.234 o.234 o.234 o.234
如果我想坚持用口罩来做,我该怎么办,有朋友可以帮忙吗?
如果你的情况你可以做切片然后crosstab
和update
s = (df.LowerAge-1)
s = s[s<df.age]
df.update(pd.crosstab(s.index,s.astype(str)).where(lambda x : x==1))
df
Out[454]:
LowerAge age 1 2 3 4
0 2 3 1.0 o.234 o.234 o.234
1 3 4 o.234 1.0 o.234 o.234
2 4 2 o.234 o.234 o.234 o.234
3 5 3 o.234 o.234 o.234 o.234
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.