pandas оставили слияние двух фреймов данных, когда один df имеет только столбцы, необходимые для слияния [duplicate]

Другое событие 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));
}

33
задан Terence Chow 28 March 2014 в 20:39
поделиться

2 ответа

Вы можете ожидать, что это увеличится, если клавиши соответствуют более одной строке в другом 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
50
ответ дан Andy Hayden 19 August 2018 в 00:13
поделиться
  • 1
    Есть ли способ подавить это? В вашем примере мне не нужно видеть строку 0 или 1, только чтобы увидеть одну из двух строк ... – Terence Chow 28 March 2014 в 21:15
  • 2
    @Chowza yup, удалите дубликаты, отредактированный ответ, чтобы это отразить. – Andy Hayden 28 March 2014 в 21:22
  • 3
    спасибо, что это сработает. – Terence Chow 28 March 2014 в 21:24
  • 4
    Просто FYI, cols теперь не рекомендуется. Вместо этого используйте 'subset': df.merge (df2.drop_duplicates (subset = ['A']), how = 'left') – SummerEla 6 August 2015 в 22:46
  • 5
    @SummerEla Спасибо! Я должен действительно решить все мои вопросы и исправить ошибки (должен быть способен ее сценарий) ... – Andy Hayden 7 August 2015 в 05:37

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

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 (), или что-то еще может разрешить для разных приложений.

Наконец, если это так, что только один набор данных имеет дубликаты, но вы все равно хотите их сохранить, вы можете использовать первую половину последней стратегии, чтобы различать дубликаты в результате слияния.

1
ответ дан seeiespi 19 August 2018 в 00:13
поделиться
Другие вопросы по тегам:

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