Удаление указанного значения c из ячейки информационного кадра и смещение значения влево - PullRequest
0 голосов
/ 18 февраля 2020

Я работаю с фреймом данных pandas. У меня есть нежелательные данные в некоторых ячейках. Мне нужно очистить эти данные от указанных c ячеек и сместить всю строку влево на одну ячейку. Я попробовал пару вещей, но это не работает для меня. Вот пример кадра данных

     userId             movieId  ratings  extra
0       1                 500      3.5     
1       1                 600      4.5    
2       1                www.abcd      700     2.0
3       2                1100      5.0
4       2                1200      4.0
5       3                 600      4.5
6       4                 600      5.0
7       4                1900      3.5

Ожидаемый результат:

     userId             movieId  ratings   extra
0       1                 500      3.5
1       1                 600      4.5
2       1                 700      2.0
3       2                1100      5.0
4       2                1200      4.0
5       3                 600      4.5
6       4                 600      5.0
7       4                1900      3.5

Я пробовал следующий код, но он показывает следующую ошибку.

raw = df[f['ratings'].str.contains('www')==True] 

#Here I am trying to fix the specific cell value to empty but it shows the following error.
**AttributeError:** 'str' object has no attribute 'at'
df = df.at[raw, 'movieId'] = ' '



#code for shifting the cell value to left
df.iloc[raw,2:-1] = df.iloc[raw,2:-1].shift(-1,axis=1)


Ответы [ 2 ]

4 голосов
/ 18 февраля 2020

Вы можете сдвигать значения по маске, но это действительно важные типы соответствия, это означает, что если столбец movieId заполнен строками (потому что, как минимум, одна строка) необходима, преобразуйте его в число c на to_numeric для предотвращения потери данных, потому что разные типы:

m = df['movieId'].str.contains('www')
df['movieId'] = pd.to_numeric(df['movieId'], errors='coerce')

#if want shift only missing values rows
#m = df['movieId'].isna()   
df[m] = df[m].shift(-1, axis=1)
df['userId'] = df['userId'].ffill()
df = df.drop('extra', axis=1)
print (df)
   userId  movieId  ratings
0     1.0    500.0      3.5
1     1.0    600.0      4.5
2     1.0    700.0      2.0
3     2.0   1100.0      5.0
4     2.0   1200.0      4.0
5     3.0    600.0      4.5
6     4.0    600.0      5.0
7     4.0   1900.0      3.5

Если преобразование в цифры не указано, c получить пропущенное значение:

m = df['movieId'].str.contains('www')
df[m] = df[m].shift(-1, axis=1)
df['userId'] = df['userId'].ffill()
df = df.drop('extra', axis=1)
print (df)
   userId movieId  ratings
0     1.0     500      3.5
1     1.0     600      4.5
2     1.0     NaN      2.0
3     2.0    1100      5.0
4     2.0    1200      4.0
5     3.0     600      4.5
6     4.0     600      5.0
7     4.0    1900      3.5
0 голосов
/ 18 февраля 2020

Вы можете попробовать это: -

df['movieId'] = pd.to_numeric(df['movieId'], errors='coerce')
df = df.sort_values(by = 'movieId', ascending = 'True')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...