Объединить 2 Dataframes по 2 значениям [дублировать]

С Swift 3, в соответствии с вашими потребностями, вы можете выбрать один из следующих блоков кода.


Включение массива Character в String без разделителя:

let characterArray: [Character] = ["J", "o", "h", "n"]
let string = String(characterArray)

print(string)
// prints "John"

Превращение массива String в String без разделителя:

let stringArray = ["Foo", "Bar", "Baz"]
let characterArray = stringArray.flatMap { String.CharacterView($0) }
//let characterArray = stringArray.flatMap { $0.characters } // also works
let string = String(characterArray)

print(string)
// prints "FooBarBaz"

Поворачивание массива String в String с разделителем между словами:

let stringArray = ["Bob", "Dan", "Bryan"]
let string = stringArray.joined(separator: " ")

print(string)
// prints "Bob Dan Bryan"

Превращение массива String в String с разделителем между символами:

let stringArray = ["car", "bike", "boat"]
let stringArray2 = stringArray.flatMap { String.CharacterView($0) }.map { String($0) }
let string = stringArray2.joined(separator: ", ")

print(string)
// prints "c, a, r, b, i, k, e, b, o, a, t"

Превращение массива Float в String с разделителем между номерами:

let floatArray = [12, 14.6, 35]
let stringArray = floatArray.flatMap { String($0) }
let string = stringArray.joined(separator: "-")

print(string)
// prints "12.0-14.6-35.0"
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 22 August 2018 в 10:44
поделиться
  • 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 22 August 2018 в 10:44
поделиться
Другие вопросы по тегам:

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