【问题标题】:Conditional replace of numbers in pandas dfpandas df中数字的条件替换
【发布时间】:2019-08-26 18:28:06
【问题描述】:

给定以下 pandas df:

import pandas as pd


df = pd.DataFrame({'1676' : ['R','NR','R','NR'],
               '1677' : ["NR", "NR" ,"NR", "NR"],
               '1710' : ["R", "R" , "NR", "NR"],
               '1536' : ["NR", "R", "NR", "R"]})

df
    1676    1677    1710    1536
0   R       NR      R       NR
1   NR      NR      R       R
2   R       NR      NR      NR
3   NR      NR      NR      R

还有这个更长的熊猫df2:

df2 = pd.DataFrame({'1' : ['1710','1676','2651','1676'],
               '2' : ["2654", "2824" ,"1676", "1677"],
               '3' : ["1676", "3079" , "1677", "2085"],
               '4' : ["1536", "1677", "1409", "1536"],
                  '5' : ["510", "1710" , "1664", "1710"],
                  '6' : ["2590", "3090" , "2252", "2916"],
                  '7' : ["2777", "1536" , "1710", "3140"],
                  '8' : ["1677", "1709" , "1536", "1963"]})

    1       2       3       4       5       6       7       8
0   1710    2654    1676    1536    510     2590    2777    1677
1   1676    2824    3079    1677    1710    3090    1536    1709
2   2651    1676    1677    1409    1664    2252    1710    1536
3   1676    1677    2085    1536    1710    2916    3140    1963

我想知道以下是否可以按行排列(此处为第一行):

  • 对于df.loc[0,] = "R" 中的每个值
  • 取对应的列名(编号)
  • df2.loc[0,]中搜索号码
  • "R" 替换df2.loc[0,] 中的数字

这样我就明白了:

    1       2       3       4       5       6       7       8
0   R       2654    R       1536    510     2590    2777    1677
1   1676    2824    3079    1677    R       3090    R       1709
2   2651    R       1677    1409    1664    2252    1710    1536
3   1676    1677    2085    R       1710    2916    3140    1963

编辑

它不适用于我的特定 df。任何猜测是什么触发了这个问题?我已经尝试过重置索引。

这是上面帖子中的df:

这是上面帖子中的 df2:

【问题讨论】:

  • 为什么有些值被替换而有些没有?它们是否必须与第一个数据帧位于同一行?
  • 是的,在这种情况下,行非常重要

标签: regex python-3.x pandas


【解决方案1】:

使用np.wherereplace

import numpy as np
r, c = np.where(df=='R')

df2.apply(lambda x: x.replace(df.columns[c[(r == x.name)]], 'R'), axis=1)

输出:

      1     2     3     4     5     6     7     8
0     R  2654     R  1536   510  2590  2777  1677
1  1676  2824  3079  1677     R  3090     R  1709
2  2651     R  1677  1409  1664  2252  1710  1536
3  1676  1677  2085     R  1710  2916  3140  1963

详情:

  • 首先,找出df中等于'R'的行和列
  • 使用 apply with axis=1 逐行,x.name 标识哪一行 index 在 C 中查找等于行索引的位置并获取 df 在该位置的列标题。
  • 使用replace替换df中列标题的所有值,在那 行。

【讨论】:

  • @Scott Boston:非常感谢!这工作正常!可悲的是,它不适用于我没有在此处发布用于复制目的的特定代码。我用我 df 的两张照片更新了帖子。
  • 您是否将结果重新分配给 df?
【解决方案2】:

给你updatestacklookup

s=df2.stack()
s=s[s.isin(df.columns)]
df2.update(pd.Series(df.mask(df=='NR').lookup(s.index.get_level_values(0),s),s.index).unstack())
df2
Out[103]: 
      1     2     3     4     5     6     7     8
0     R  2654     R  1536   510  2590  2777  1677
1  1676  2824  3079  1677     R  3090     R  1709
2  2651     R  1677  1409  1664  2252  1710  1536
3  1676  1677  2085     R  1710  2916  3140  1963

【讨论】:

  • 我不知道为什么我对“查找”有这样的心理锁定,我在解决问题时从不记得那种方法。 +1
  • 永远不要使用.lookup,因为关于它的文档几乎没有。知道在哪些情况下使用会很有用。 @Wen-Ben,也许是关于它的问答?
  • @ScottBoston aha :-) ,我认为查找并不那么重要,我相信你知道有几十种方法可以做同样的事情 :-)
  • @Erfan 就像索引和列检查 :-)
  • @Wen-Ben:非常感谢!这工作正常!可悲的是,它不适用于我没有在此处发布用于复制目的的特定代码。我用我的特定 df 的两张图片更新了帖子。
猜你喜欢
  • 1970-01-01
  • 2018-11-11
  • 2021-07-02
  • 2022-12-18
  • 1970-01-01
  • 2014-03-03
相关资源
最近更新 更多