слияние Python с пандами (тот же индекс, тот же столбец) все еще возвращает меня с колонками _x и _y - PullRequest
0 голосов
/ 29 октября 2018

У меня есть два кадра данных, A и B. A и B имеют одинаковые индексы и одинаковые имена столбцов. Тем не менее, их записи разные (перемешивание значений и NaN).

Я хочу объединить A и B в другой фрейм данных C с теми же индексами и столбцами.

Давайте возьмем A.iloc [1,2], первую строку и запись третьего столбца A, например. Если эта запись в A является NaN, но в B это 99, я бы хотел, чтобы C.iloc [1,2] был 99. Если они оба NaN, то результатом будет NaN.

Если они оба значения, скажем, 23 и 99, я бы хотел, чтобы слияние привело к большему числу (99), но мне нужно пометить индекс как ошибочный.

Что я сделал:

  1. Написал цикл for, используя строки и столбцы, для соответствия между двумя кадрами данных. Например, если запись больше 0 в A и больше 0 в B, я сохраняю индекс записи в списке и добавляю большее значение в C. Это ужасно неэффективно, и я хотел бы использовать лучший метод. (плюс это не удалось, потому что я ужасный программист)

  2. Пробовал с помощью pandas.merge. Я не особенно понимаю процесс слияния, но я пробовал несколько способов, например pd.merge(A, B, left_on = A.index, right_on = B.index, how = 'outer', indicator = True). Он вернул мне фрейм данных с еще большим количеством строк и удвоил столбцы с добавлением x и y в конце их имен.

Есть идеи?

1 Ответ

0 голосов
/ 29 октября 2018

Итак, насколько я понимаю, вы хотите обновить df1 с df2 только для значений Non-Null.

Возьмите ниже Dataframes, например:

In [1761]: df1
Out[1761]: 
   val1  val2  val3
0   NaN   NaN  0.20
1   NaN   0.2   NaN
2   NaN   NaN  0.13
3   NaN  50.0  0.40

In [1762]: df2
Out[1762]: 
   val1   val2  val3
0    99   0.10   NaN
1    99    NaN  0.10
2    99    NaN  0.13
3    99  50.00  0.40

Таким образом, в приведенном выше случае произойдут обновления ниже:

1.) Все строки для столбца val1 из df1 будут обновлены на val1 из df2, поскольку df2 содержит все ненулевые значения для этого столбца.

2.) Только 1-я строка для столбца val2 из df1 будет обновлена ​​на val2 из df2, так как df2 имеет ненулевое значение для 1-й строки этого столбца.

3.) Только 2-я строка для столбца val3 из df1 будет обновлена ​​на val3 из df2, так как df2 имеет ненулевое значение для 2-й строки этого столбца.

Примечание: 3-я строка для столбца val2 из df1 не будет обновлена, поскольку имеет значение NULL даже в df2.

Ниже приведен код для выполнения вышеуказанного:

df1[~df1.notnull()] = df2[df2.notnull()]

Теперь df1 после обновления выглядит так:

In [1766]: df1
Out[1766]: 
   val1  val2  val3
0  99.0   0.1  0.20
1  99.0   0.2  0.10
2  99.0   NaN  0.13
3  99.0  50.0  0.40

Я думаю, что это решает ваш вопрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...