Поменять значения столбцов для выбранных строк в пандах - PullRequest
0 голосов
/ 14 октября 2019

Мне нужно очистить набор данных, есть некоторые столбцы с ошибками, поскольку их значения обмениваются, потому что b не может быть больше, чем a, я создал столбец с именем wrong_data, и он имеет значение Trueв любое время это происходит:

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

Теперь я хочу обмениваться данными в a и b всякий раз, когда выполняется условие, поэтому всякий раз, когда выполняется wrong_data = true.

ПокаЯ пытался:

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

Но, очевидно, синтаксис неправильный, и я не уверен, как с этим справиться.

Ответы [ 3 ]

0 голосов
/ 14 октября 2019

Вы также можете использовать пару np.where операторов:

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

0 голосов
/ 14 октября 2019

Вам не нужен 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]
0 голосов
/ 14 октября 2019

добро пожаловать в 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...