#python #dataframe #nan
#python #фрейм данных #nan
Вопрос:
У меня есть фрейм данных, который выглядит следующим образом;
[index, Data]
[1, [5,3,6,8,4,5,7etc]]
Данные в моем столбце «данные» остаются в массиве. Мне нужно иметь не менее 75 значений в каждом массиве. Фрейм данных имеет длину 438 строк.
Мне нужно создать фильтр, в котором все массивы, содержащие менее 75 значений, будут заменены на NaN.
Я подумал о чем-то подобном:
for i in range(len(df_window)):
if len(df_window['Data'][i][0])<75:
Я не знаю, правильно ли это и как продолжить. Фрейм данных называется df_window
может кто-нибудь мне быстро помочь, пожалуйста?
Комментарии:
1. Зачем вам NaN? Вы уверены, что None не будет лучше? Или, может быть, полностью удалить эти строки из данных?
2. Причина, по которой я хочу получить NaN, заключается в том, что я хочу впоследствии удалить эти строки. Но у меня есть два разных фрейма данных, где эти строки NaN должны быть удалены, если вы понимаете, что я имею в виду. Потому что после всей этой фильтрации я хочу сравнить эти два фрейма данных друг с другом, поэтому расположение двух должно быть одинаковым
3. Если я вас понимаю, у вас есть 2 фрейма данных, каждый из которых содержит 438 строк, и вы хотите выполнить сравнение строк по строкам. В этом случае может иметь смысл иметь проверку на длину> 75 как часть любой функции сравнения, поскольку вам все равно нужно будет проверять наличие NAN в функции сравнения.
4. да, действительно. Итак, в конце сценария я хочу разделить эти два фрейма данных друг на друга. Но чтобы сделать это, я должен сделать фреймы данных точно такими же. массивы с менее чем 75 значениями могут рассматриваться как «манипулируемые» и должны быть удалены. Таким образом, эта строка должна быть удалена в обоих кадрах. Для этого мне нужно сделать длину каждой строки одинаковой для обоих фреймов, посмотрев, у какого из двух меньше значений, а у другого столько же значений. Вы можете помочь?
Ответ №1:
Вы можете использовать lengths = df_window['Data'].apply(len)
для получения последовательности длин массива. Затем, используя df_window.loc[(lengths < 75), 'Data'] = np.nan
, вы должны получить то, что хотите.
РЕДАКТИРОВАТЬ: исправлена первая строка.
Комментарии:
1. Поскольку это список в одной ячейке, вывод .apply(len) равен 1 для каждой строки, так что это не работает. Поэтому я должен найти другое решение для этого. То, что я сделал выше в цикле for, дает мне длины массивов. Единственное, что я не знаю, как потом заменить его на nan
2. О да, действительно, тогда используйте lengths = df_window[‘Data’].apply(len) .
3. это сработало, спасибо! Вы также знаете, как я должен сделать следующее: мне нужно посмотреть, есть ли разница между обоими массивами. так, например, в df1 массив в строке 1 имеет 80 значений, а в df2 в той же строке 78 значений. Поэтому мне нужно искать каждую строку, в которой массив df имеет наименьшие значения, и мне нужно сделать их одинаковыми. Итак, я думаю (если у меня 78 и 80), мне нужно сделать значение с 80 также 78, выбрав в этом случае последние 78 значений. Я должен сделать это для каждой строки
4. Привет! Ну да, вы можете сделать так jovian.ai/dev-perrier-remi/so-replace-by-nan Я сделал заметку, что так было проще. Замените 0 на имя вашего столбца, и все будет хорошо. Однако это немного медленно, вы хотите избежать цикла for в dataframe, но все должно быть в порядке.