Другое событие NullPointerException
возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.
String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals
для гарантированного непустого объекта.
Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null
.
Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.
String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
System.out.println(phrase.equals(keyPhrase));
}
Вы можете ожидать, что это увеличится, если клавиши соответствуют более одной строке в другом DataFrame:
In [11]: df = pd.DataFrame([[1, 3], [2, 4]], columns=['A', 'B'])
In [12]: df2 = pd.DataFrame([[1, 5], [1, 6]], columns=['A', 'C'])
In [13]: df.merge(df2, how='left') # merges on columns A
Out[13]:
A B C
0 1 3 5
1 1 3 6
2 2 4 NaN
Чтобы избежать этого поведения , удалите дубликаты в df2:
In [21]: df2.drop_duplicates(subset=['A']) # you can use take_last=True
Out[21]:
A C
0 1 5
In [22]: df.merge(df2.drop_duplicates(subset=['A']), how='left')
Out[22]:
A B C
0 1 3 5
1 2 4 NaN
Существуют также стратегии, которые вы можете использовать, чтобы избежать такого поведения, которое не связано с потерей дублированных данных, если, например, дублируются не все столбцы. Если у вас есть
In [1]: df = pd.DataFrame([[1, 3], [2, 4]], columns=['A', 'B'])
In [2]: df2 = pd.DataFrame([[1, 5], [1, 6]], columns=['A', 'C'])
, одним из способов было бы взять среднее значение дубликата (также можно взять сумму и т. Д.)
In [3]: df3 = df2.groupby('A').mean().reset_index()
In [4]: df3
Out[4]:
C
A
1 5.5
In [5]: merged = pd.merge(df,df3,on=['A'], how='outer')
In [6]: merged
Out[204]:
A B C
0 1 3 5.5
1 2 4 NaN
Альтернативно, если вы имеют нечисловые данные, которые не могут быть преобразованы с помощью pd.to_numeric (), или если вы просто не хотите принимать среднее значение, вы можете изменить переменную слияния путем перечисления дубликатов. Однако эта стратегия будет применяться, когда дубликаты существуют в обоих наборах данных (что вызовет такое же проблемное поведение, а также является общей проблемой):
In [7]: df = pd.DataFrame([['a', 3], ['b', 4],['b',0]], columns=['A', 'B'])
In [8]: df2 = pd.DataFrame([['a', 3], ['b', 8],['b',5]], columns=['A', 'C'])
In [9]: df['count'] = df.groupby('A')['B'].cumcount()
In [10]: df['A'] = np.where(df['count']>0,df['A']+df['count'].astype(str),df['A'].astype(str))
In[11]: df
Out[11]:
A B count
0 a 3 0
1 b 4 0
2 b1 0 1
Сделайте то же самое для df2, сбросьте переменные count в df и df2 и слить на «A»:
In [16]: merged
Out[16]:
A B C
0 a 3 3
1 b 4 8
2 b1 0 5
Несколько заметок. В этом последнем случае я использую .cumcount () вместо .duplicated, потому что это может быть случай, когда у вас есть несколько дубликатов для данного наблюдения. Кроме того, я использую .astype (str), чтобы преобразовать значения count в строки, потому что я использую команду np.where (), но используя pd.concat (), или что-то еще может разрешить для разных приложений.
Наконец, если это так, что только один набор данных имеет дубликаты, но вы все равно хотите их сохранить, вы можете использовать первую половину последней стратегии, чтобы различать дубликаты в результате слияния.