Условные комментарии являются стандартом 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 -->
перед кодом. Другие браузеры по-прежнему будут считать это частью комментария.
Рассмотрим следующие файлы данных
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
Это один из способов сделать то, что вы хотите
# 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)
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 перекрытий
петли плохие
У вас будут обе таблицы 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
У меня была та же проблема. Этот ответ с использованием 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
Самый простой ответ:
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()]
Должен быть и самый быстрый.
combine_first
. Проблема состоит в том, что если ключ существует в A, но некоторые из столбцов являются нулевыми, эти значения могут быть заполнены значениями B с одним и тем же ключом. ответ на вопрос, который вы задали в комментариях, заключается в том, чтоcombine_first
ожидает, что ключ будет в индексе. – piRSquared 22 July 2016 в 07:28