熊猫替换,多列标准

巴特

我正在尝试根据多列上的某些条件替换Pandas数据框中的值。对于单列条件,可以使用字典非常优雅地完成此操作(例如,使用dict重新映射pandas列中的值):

import pandas as pd

df = pd.DataFrame({'col1': {0:1, 1:1, 2:2}, 'col2': {0:10, 1:20, 2:20}})

rdict = {1:'a', 2:'b'}
df2 = df.replace({"col1": rdict})

输入df

   col1  col2
0     1    10
1     1    20
2     2    20

结果df2

  col1  col2
0    a    10
1    a    20
2    b    20

我试图将其扩展到多个列的条件(例如where col1==1, col2==10->替换)。对于单个条件,可以这样完成:

df3=df.copy()
df3.loc[((df['col1']==1)&(df['col2']==10)), 'col1'] = 'c'

结果是df3

  col1  col2
0    c    10
1    1    20
2    2    20 

我的现实生活中的问题涉及很多标准,其中涉及大量的df3.loc[((criteria1)&(criteria2)), column] = value调用,与使用字典作为“查找表”进行替换相比,这远远不够优雅。是否可以将优雅的解决方案(df2 = df.replace({"col1": rdict})扩展到一种设置,其中一列中的值被基于多列的条件替换?


我要达到的目标的一个示例(尽管在我的现实生活中,标准的数量大得多):

df = pd.DataFrame({'col1': {0:1, 1:1, 2:2, 3:2}, 'col2': {0:10, 1:20, 2:10, 3:20}})

df3=df.copy()
df3.loc[((df['col1']==1)&(df['col2']==10)), 'col1'] = 'a'
df3.loc[((df['col1']==1)&(df['col2']==20)), 'col1'] = 'b'
df3.loc[((df['col1']==2)&(df['col2']==10)), 'col1'] = 'c'
df3.loc[((df['col1']==2)&(df['col2']==20)), 'col1'] = 'd'

输入df

0     1    10
1     1    20
2     2    10
3     2    20

结果df3

  col1  col2
0    a    10
1    b    20
2    c    10
3    d    20
要么

我们可以使用merge

假设您的df看起来像

df = pd.DataFrame({'col1': {0:1, 1:1, 2:2, 3:2, 4:2, 5:1}, 'col2': {0:10, 1:20, 2:10, 3:20, 4: 20, 5:10}})

    col1 col2
0   1    10
1   1    20
2   2    10
3   2    20
4   2    20
5   1    10

您的条件替换可以表示为另一个数据框:

df_replace

  col1  col2    val
0   1   10      a
1   1   20      b
2   2   10      c
3   2   20      d

(As OP (Bart) pointed out, you can save this in a csv file.)

那你可以用

df = df.merge(df_replace, on=["col1", "col2"], how="left")

    col1    col2    val
0   1       10      a
1   1       20      b
2   2       10      c
3   2       20      d
4   2       20      d
5   1       10      a

然后,您只需要放下col1

正如MaxU所指出的,可能有一些行没有被替换而导致NaN我们可以使用像

df["val"] = df["val"].combine_first(df["col1"])

col1如果合并后的结果值为,从中填充值NaN

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章