[英]updated question: Updating a row value based on another row value with certain condition, pandas
我正在尝试做这样的事情。 我有一个数据框:
list_val = {'Region': [3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3715, 3718, 3718, 3718],
'Category': [1, 1, 1, 1,1, 2, 2 ,2 ,2, 2,1 ,1 ,1],
'level': ['E', 'E/M', 'M', 'S', 'unknown', 'E', 'E/M', 'M', "S", "unknown", 'M', "E/M", 'unknown'],
'low': [2, 5, 10, 4, -1, 8, 12, 5, 14, -1, 3, 5, -1],
'high': [3, 6, 5, 6, -1, 12, 8, 9, 15, -1, 3, 8, -1]}
df = pd.DataFrame(list_val)
df
Region Category level low high
0 3715 1 E 2 3
1 3715 1 E/M 5 6
2 3715 1 M 10 5
3 3715 1 S 4 6
4 3715 1 unknown -1 -1
5 3715 2 E 8 12
6 3715 2 E/M 12 8
7 3715 2 M 5 9
8 3715 2 S 14 15
9 3715 2 unknown -1 -1
10 3718 1 M 3 3
11 3718 1 E/M 5 8
12 3718 1 unknown -1 -1
我正在尝试使用“未知”级别填充“低”列,即 -1 使用“低”值,其中级别为“E”,即 2,将“高”值填充为“未知”级别,即 -1 使用“高”值,其中级别为“S”,即每个类别和每个区域的 6 等。 如果对于任何区域和类别,如果缺少级别“E”或“S”,请将低值和高值仅保留为 -1。 所以我想要的是这个:
Region Category level low high
0 3715 1 E 2 3
1 3715 1 E/M 5 6
2 3715 1 M 10 5
3 3715 1 S 4 6
4 3715 1 unknown 2 6
5 3715 2 E 8 12
6 3715 2 E/M 12 8
7 3715 2 M 5 9
8 3715 2 S 14 15
9 3715 2 unknown 8 15
10 3718 1 M 3 3
11 3718 1 E/M 5 8
12 3718 1 unknown -1 -1
我尝试了各种方法,但没有给出我想要的,我尝试的最新方法是:
for index in df.index:
if df.loc[index,'level'] == 'Unknown':
df.loc[index,'low'] = df['low'].where(df['level'] == 'E')
df.loc[index, 'high'] = df['high'].where(df['level] == 'S')
但这会产生错误。 有人可以请指导,我应该怎么做? 谢谢!
使用loc
update 和map/replace
:
e_val = df.loc[df['level']=='E'].set_index(['Region', 'Category'])['low']
# use `lower` since there is `unknown` and `Unknown`
unknowns = df['level'].str.lower() == 'unknown'
df.loc[unknowns, 'low'] = (df.loc[unknowns, ['Region','Category']]
.agg(tuple,axis=1)
.map(e_val)
)
输出:
Region Category level low high
0 3715 1 E 2.0 3
1 3715 1 E/M 5.0 6
2 3715 1 M 10.0 5
3 3715 1 S 4.0 6
4 3715 1 unknown 2.0 -1
5 3715 2 E 8.0 12
6 3715 2 E/M 12.0 8
7 3715 2 M 5.0 9
8 3715 2 S 14.0 15
9 3715 2 unknown 8.0 -1
10 3718 1 M 3.0 3
11 3718 1 E/M 5.0 8
12 3718 1 unknown NaN -1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.