#python #pandas #replace #conditional-statements
#python #pandas #заменить #условные операторы
Вопрос:
вот все, что у меня есть, это DF
data={"col1":[np.nan,3,4,5,9,2,6],
"col2":[4,2,4,6,0,1,5],
"col3":[7,6,0,11,3,6,7],
"col4":[14,11,22,8,6,np.nan,9],
"col5":[0,5,7,3,8,2,9],
"type":["B","B","C","A","B","A","B"],
"number":["one",np.nan,"two","one","one","two",np.nan]}
df=pd.DataFrame.from_dict(data)
этот dict :
my_dict={"F":{"col1":2,"col2":44,"col3":0},"B":{"col1":0,"col2":11,"col3":4,"col4":50,"col5":np.nan}}
Я хочу заменить ячейки в соответствии со словарем (по типу), только в тех случаях, когда «число» равно NaN
Я пробую это, но он воспроизводит все места, где тип «B», без учета «числа» «NaN».
updatedf=pd.DataFrame(my_dict).T.reindex(df.type)
updatedf.index=df.index
df.update(updatedf)
print(df)
как я могу добавить условие «NaN» в столбец «number»?
это то, что я хочу получить
data={"col1":[np.nan,0 ,4,5,9,2,0 ],
"col2":[4,11,4,6,0,1,11],
"col3":[7,4 ,0,11,3,6,4 ],
"col4":[14,50,22,8,6,np.nan,50],
"col5":[0,5 ,7,3,8,2,5 ],
"type":["B","B","C","A","B","A","B"],
"number":["one",np.nan,"two","one","one","two",np.nan]}
df=pd.DataFrame.from_dict(da
Ответ №1:
измените обновление на fillna
updatedf=pd.DataFrame(my_dict).T.reindex(df.type)
updatedf.index=df.index
updatedf=updatedf[df.number.isna()]
df.update(updatedf)
Комментарии:
1. спасибо, но это тоже работает не так, как я хочу. я отредактировал Q, и теперь вы можете видеть, что я ожидаю получить. мне нравится заменять только тогда, когда число == NaN
2. @matan Обновлено ~ 🙂
Ответ №2:
Вы можете использовать логическую индексацию, чтобы получить только те строки, где number
находится NaN
, затем используйте fillna
:
updatedf=pd.DataFrame(my_dict).T
df = df.set_index('type')
df.loc[df.number.isna()] = df.loc[df.number.isna()].fillna(updatedf)
Комментарии:
1. спасибо, но это тоже работает не так, как я хочу. я отредактировал Q, и теперь вы можете видеть, что я ожидаю получить. мне нравится заменять только тогда, когда число == NaN
2.
.loc[df.number.isna()]
Предполагается, что это делается.3. Я пробовал, но ничего не изменилось, может быть, проблема с индексом?
4. возможно, используйте
update
вместоfillna
, как изначально в вашем коде.5. спасибо, я использую @BEN_YO ans, но вы тоже были очень полезны