заменить строку на dict и условие

#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, но вы тоже были очень полезны