繁体   English   中英

更新的问题:基于具有特定条件的另一个行值更新一个行值,pandas

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM