【问题标题】:Replace specific values in pandas dataframe with the corresponding column name, based on a condition,根据条件,将 pandas 数据框中的特定值替换为相应的列名,
【发布时间】:2021-09-07 04:05:30
【问题描述】:

我的 pandas 数据框有三个可能的条目:

  • 1(整数)
  • NaN
  • 任意字符串

可以这样创建一个示例:

pd.DataFrame({'column1':['yes','some_string',np.NaN],
              'column2':[np.NaN,np.NaN,'yes']}, columns=['column1','column2'])

我想实现以下目标:

  1. 无论元素值为yes,我都希望将其替换为列名column1column2
  2. 当元素为 NaN 时,应保持不变
  3. 如果有字符串some_string我要放在括号里,附上and和对应的列名:'column1 and (some_string)'

我尝试了一个条件 df.apply 但它不起作用,因为它应用于 Series 并且我不知道如何施加条件 (=='yes')

我也尝试过熊猫面具,但我不知道如何用不同的元素代替静态元素。

【问题讨论】:

  • df.apply 传递 axis=1 将允许您选择行。系列标签也传递列名。

标签: python pandas replace apply


【解决方案1】:

IIUC 尝试添加方括号和“和”,然后将 mask 排除在 yesradd 列名之外:

new_df = (' and (' + df + ')').mask(df.eq('yes'), '').radd(df.columns)

new_df:

                     column1  column2
0                    column1      NaN
1  column1 and (some_string)      NaN
2                        NaN  column2

步骤分解:

new_df = ' and (' + df + ')'
              column1     column2
0           and (yes)         NaN
1   and (some_string)         NaN
2                 NaN   and (yes)

mask:

new_df = new_df.mask(df.eq('yes'), '')
              column1 column2
0                         NaN
1   and (some_string)     NaN
2                 NaN        

radd:

new_df = new_df.radd(df.columns)
                     column1  column2
0                    column1      NaN
1  column1 and (some_string)      NaN
2                        NaN  column2

【讨论】:

  • 哇,几个小时后我无法解决它。尽管在最后一步中,我不确定 pandas 是如何知道它应该将 df.columns 中的哪个值添加到哪个元素的,但我可以自己解决这个问题。非常感谢,已经很完美了!
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-25
  • 1970-01-01
  • 2022-12-31
  • 2019-01-24
相关资源
最近更新 更多