INNER Merge на основе несоответствующего столбца в двух файлах данных - python & amp; pandas [duplicate]

Условные комментарии являются стандартом IE для IE, и они не являются частью какого-либо стандарта. Если вы проверяете структуру условного комментария:

<!--[if gt IE 7]>
Here is some code.
<![endif]-->

Как видно из названия, это всего лишь большой комментарий <!-- comment -->. IE проверяет комментарии для таких условий, которые, опять же, не соответствуют стандартам HTML.

Чтобы создать код, который не отображается в IE, но выполняет визуализацию в других браузерах, вы используете следующее условие:

<!--[if !IE]> -->
This will be rendered by anything but IE.
<!-- <![endif]-->

Посмотрите, как условия заключены в закрытые комментарии? Вот почему это отображается в обычных браузерах, в то время как IE проверяет условное выражение и решает опустить все до endif.

EDIT

Если вы хотите добавить другое условие , и продолжайте рендеринг кода в браузерах, отличных от IE, вы можете использовать следующее обходное решение:

<!--[if gt IE 7]> <!-- -->
Here is some code for anything but IE 7 and below.
<!-- <![endif]-->

Примечание. Мне пришлось снова открыть комментарий, чтобы предотвратить рендеринг IE --> перед кодом. Другие браузеры по-прежнему будут считать это частью комментария.

15
задан piRSquared 9 November 2016 в 01:45
поделиться

4 ответа

Рассмотрим следующие файлы данных

TableA = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('abcd'), name='Key'),
                      ['A', 'B', 'C']).reset_index()
TableB = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('aecf'), name='Key'),
                      ['A', 'B', 'C']).reset_index()

TableA


TableB

Это один из способов сделать то, что вы хотите

Способ 1

# Identify what values are in TableB and not in TableA
key_diff = set(TableB.Key).difference(TableA.Key)
where_diff = TableB.Key.isin(key_diff)

# Slice TableB accordingly and append to TableA
TableA.append(TableB[where_diff], ignore_index=True)

Метод 2

rows = []
for i, row in TableB.iterrows():
    if row.Key not in TableA.Key.values:
        rows.append(row)

pd.concat([TableA.T] + rows, axis=1).T

Сроки

4 строки с 2 перекрытиями

Метод 1 намного быстрее

10 000 строк 5 000 перекрытий

петли плохие

9
ответ дан piRSquared 16 August 2018 в 02:45
поделиться
  • 1
    Благодарю. Просто взглянул на документацию для comb_first, и это похоже на то, что я ищу. Однако как указать столбец для объединения (ключ)? Для каждой строки в таблице B я хочу, чтобы она проверила значение в & quot; Key & quot; и если это значение содержится в таблице A «Ключ», column Я хочу игнорировать эту строку в B. Где есть ключевое значение в таблице B, которое отсутствует в таблице A, я хочу добавить эту строку из таблицы B. – Ayelavan 22 July 2016 в 04:38
  • 2
    @Ayelavan, подумав об этом, я не могу рекомендовать combine_first. Проблема состоит в том, что если ключ существует в A, но некоторые из столбцов являются нулевыми, эти значения могут быть заполнены значениями B с одним и тем же ключом. ответ на вопрос, который вы задали в комментариях, заключается в том, что combine_first ожидает, что ключ будет в индексе. – piRSquared 22 July 2016 в 07:28
  • 3
    Это именно то, что я искал. большое спасибо – Ayelavan 22 July 2016 в 09:55

У вас будут обе таблицы TableA и TableB, так что оба объекта DataFrame имеют столбцы с уникальными значениями в своих соответствующих таблицах, но некоторые столбцы могут иметь значения, которые происходят одновременно (имеют одинаковые значения для строки ) в обеих таблицах.

Затем мы хотим объединить строки в TableA со строками в TableB, которые не соответствуют ни одному в TableA для столбца «Ключ». Концепция состоит в том, чтобы представить ее как сравнение двух серий переменной длины и комбинирования строк в одной серии sA с другими sB, если значения sB не соответствуют sA. Следующий код решает это упражнение:

import pandas as pd

TableA = pd.DataFrame([[2, 3, 4], [5, 6, 7], [8, 9, 10]])
TableB = pd.DataFrame([[1, 3, 4], [5, 7, 8], [9, 10, 0]])

removeTheseIndexes = []
keyColumnA = TableA.iloc[:,1] # your 'Key' column here
keyColumnB = TableB.iloc[:,1] # same

for i in range(0, len(keyColumnA)):
    firstValue = keyColumnA[i]
    for j in range(0, len(keyColumnB)):
        copycat = keyColumnB[j]
        if firstValue == copycat:
            removeTheseIndexes.append(j)

TableB.drop(removeTheseIndexes, inplace = True)
TableA = TableA.append(TableB)
TableA = TableA.reset_index(drop=True)

Обратите внимание, что это также влияет на данные TableB. Вы можете использовать inplace=False и повторно назначить его на newTable, затем TableA.append(newTable).

# Table A
   0  1   2
0  2  3   4
1  5  6   7
2  8  9  10

# Table B
   0   1  2
0  1   3  4
1  5   7  8
2  9  10  0

# Set 'Key' column = 1
# Run the script after the loop

# Table A
   0   1   2
0  2   3   4
1  5   6   7
2  8   9  10
3  5   7   8
4  9  10   0

# Table B
   0   1  2
1  5   7  8
2  9  10  0
1
ответ дан Jossie Calderon 16 August 2018 в 02:45
поделиться

У меня была та же проблема. Этот ответ с использованием how='outer' и indicator=True слияния побудил меня придумать это решение:

import pandas as pd
import numpy as np

TableA = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('abcd'), name='Key'),
                      ['A', 'B', 'C']).reset_index()
TableB = pd.DataFrame(np.random.rand(4, 3),
                      pd.Index(list('aecf'), name='Key'),
                      ['A', 'B', 'C']).reset_index()

print('TableA', TableA, sep='\n')
print('TableB', TableB, sep='\n')

TableB_only = pd.merge(
    TableA, TableB,
    how='outer', on='Key', indicator=True, suffixes=('_foo','')).query(
        '_merge == "right_only"')

print('TableB_only', TableB_only, sep='\n')

Table_concatenated = pd.concat((TableA, TableB_only), join='inner')

print('Table_concatenated', Table_concatenated, sep='\n')

Который печатает этот вывод:

TableA
  Key         A         B         C
0   a  0.035548  0.344711  0.860918
1   b  0.640194  0.212250  0.277359
2   c  0.592234  0.113492  0.037444
3   d  0.112271  0.205245  0.227157
TableB
  Key         A         B         C
0   a  0.754538  0.692902  0.537704
1   e  0.499092  0.864145  0.004559
2   c  0.082087  0.682573  0.421654
3   f  0.768914  0.281617  0.924693
TableB_only
  Key  A_foo  B_foo  C_foo         A         B         C      _merge
4   e    NaN    NaN    NaN  0.499092  0.864145  0.004559  right_only
5   f    NaN    NaN    NaN  0.768914  0.281617  0.924693  right_only
Table_concatenated
  Key         A         B         C
0   a  0.035548  0.344711  0.860918
1   b  0.640194  0.212250  0.277359
2   c  0.592234  0.113492  0.037444
3   d  0.112271  0.205245  0.227157
4   e  0.499092  0.864145  0.004559
5   f  0.768914  0.281617  0.924693
3
ответ дан tommy.carstensen 16 August 2018 в 02:45
поделиться

Самый простой ответ:

tableB = pd.concat([tableB, pd.Series(1)], axis=1)
mergedTable = tableA.merge(tableB, how="left" on="key")

answer = mergedTable[mergedTable.iloc[:,-1].isnull()][tableA.columns.tolist()]

Должен быть и самый быстрый.

0
ответ дан Jamie Marshall 16 August 2018 в 02:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: