【问题标题】:Swap column values for selected rows in pandas交换熊猫中选定行的列值
【发布时间】:2020-02-11 08:20:06
【问题描述】:

我需要清理一个数据集,因为b 不能大于a,所以有一些列有错误,因为它们的值被交换,我创建了一个名为wrong_data 的列,它有一个 True 值任何时候发生这种情况:

   df['wrong_data'] =  (df['a'] < df['b'] )

现在我想在满足条件时交换ab 中的数据,所以只要wrong_data = true 成立。

到目前为止,我已经尝试过:

df.at[wrong_data = true, 'a'] = b
df.at[wrong_data = true, 'b'] = a

但显然语法是错误的,我不知道如何处理它。

【问题讨论】:

  • 您可以对我认为的简单解决方案进行排序 - df[['a','b']] = np.sort(df[['a','b']],axis=1)[:,::-1]

标签: python pandas numpy jupyter-notebook


【解决方案1】:

欢迎使用 StackOverflow!

我认为您可以省略第三列。您是否尝试过以下方法:

wrongDataIdx = (df['a'] < df['b'])
df.loc[wrongDataIdx, ['a', 'b']] = df.loc[wrongDataIdx, ['b', 'a']].values

这应该可以解决您的问题。很高兴听到一些建设性的反馈!

测试:

>>> df = pd.DataFrame({'a': [1,2,3], 'b': [4,3,2]})
>>> wrongDataIdx = (df['a'] < df['b'])
>>> df.loc[wrongDataIdx, ['a', 'b']] = df.loc[wrongDataIdx, ['b', 'a']].values
>>> df
a  b
0  4  1
1  3  2
2  3  2

【讨论】:

    【解决方案2】:

    您还可以使用几个np.where 语句:

    df['a'] = np.where(df['wrong_data'] == True, 'b', 'a')
    df['b'] = np.where(df['wrong_data'] == True, 'a', 'b')
    
    

    【讨论】:

      【解决方案3】:

      您不需要wrong_data 列。

      试试这个:

      df[["a", "b"]]=df.apply(lambda x: pd.Series(sorted([x.a, x.b])), axis=1)
      

      示例输入:

      import pandas as pd
      
      df=pd.DataFrame(data={"a": [1,5,7,9,11], "b": [2,3,10,-6,2]})
      
      print(df)
      
      df[["a", "b"]]=df.apply(lambda x: pd.Series(sorted([x.a, x.b])), axis=1)
      
      print(df)
      

      输出:

        a   b
      0   1   2                                                   
      1   5   3                                                   
      2   7  10                                                   
      3   9  -6                                                   
      4  11   2                                                      
        a   b                                                    
      0  1   2                                                    
      1  3   5                                                    
      2  7  10                                                    
      3 -6   9                                                    
      4  2  11                                                   
       [Program finished]
      

      【讨论】:

        猜你喜欢
        • 2020-08-20
        • 2018-06-05
        • 1970-01-01
        • 2016-04-11
        • 2016-07-27
        • 2023-02-25
        • 1970-01-01
        • 1970-01-01
        • 2022-12-23
        相关资源
        最近更新 更多