Из этого вопроса , у меня есть две матрицы, и я хочу объединить их таким образом, чтобы я оставил соединение dfB с dfA, заменяя значения NaN значениями, отличными от NaN, где бы они у меня не находились.
То есть
>>> dfA
s_name geo zip date value
0 A zip 60601 2010 NaN # In the earlier question, this was None
1 B zip 60601 2010 NaN # rather than NaN, which was
2 C zip 60601 2010 NaN # a mistake.
3 D zip 60601 2010 NaN
>>> dfB
s_name geo zip date value
0 A zip 60601 2010 1.0
1 B zip 60601 2010 NaN
3 D zip 60601 2010 4.0
Объединяя их, я вижу:
>>> new = pd.merge(dfA,dfB,on=["s_name","geo", "geoid", "date"],how="left")
>>> new.head()
name geo zip date value_x value_y
0 A state 01 2009 NaN 1.0
1 B state 01 2010 NaN NaN
2 C state 01 2011 NaN NaN
3 D state 01 2012 NaN 4.0
4 E state 01 2013 NaN 5.0
Я не могу быть уверен, что value_y всегда пронумеровано, а value_x всегда NaN.Но я хочу объединенное значение, назовите его value
, в зависимости от того, какое значение не является NaN.Я пытаюсь это:
>>> new["value"] = new.apply(lambda r: r.value_x or r.value_y, axis=1)
>>> new.head()
name geo zip date value_x value_y value
0 A state 01 2009 NaN 1.0 NaN
1 B state 01 2010 NaN NaN NaN
2 C state 01 2011 NaN NaN NaN
3 D state 01 2012 NaN 4.0 NaN
4 E state 01 2013 NaN 5.0 NaN
О, нет.
Имеет смысл в том, что NaN должен распространяться, но это не то, что я ищу.Я хотел бы, чтобы логика возвращала то, что присутствует, а не возвращала NaN, если присутствует.
Я бы хотел логику, которую мне не дает Никто.Вы можете видеть:
>>> new["value_z"] = None
>>> new.head()
name geo zip date value_x value_y value value_z
0 A state 01 2009 NaN 1.0 NaN None
1 B state 01 2010 NaN NaN NaN None
2 C state 01 2011 NaN NaN NaN None
3 D state 01 2012 NaN 4.0 NaN None
4 E state 01 2013 NaN 5.0 NaN None
>>> new["value2"] = new.apply(lambda r: r.value_z or r.value_y, axis=1)
>>> new.head()
name geo zip date value_x value_y value value_z value2
0 A state 01 2009 NaN 1.0 NaN None 1.0
1 B state 01 2010 NaN NaN NaN None NaN
2 C state 01 2011 NaN NaN NaN None NaN
3 D state 01 2012 NaN 4.0 NaN None 4.0
4 E state 01 2013 NaN 5.0 NaN None 5.0
Логика, которая создает value2
, - это поведение, которое я ищу, а не value
.
Какой лучший способ сделать это?