Слияние фреймов данных Python без дублирования - PullRequest
0 голосов
/ 24 сентября 2018

У меня есть два фрейма данных df1 и df2, и я хочу объединить их.

Фрейм данных df1 выглядит следующим образом:

   IDs          Value1      Value2       
   AB              1          3
   AB              1          1
   AB              2          4           
   BC              2          2
   BC              5          0         
   BG              1          1         
   RF              2          2

и фрейм данных df2 - этоследующим образом:

   IDs          Issue     
   AB              AA
   AB              AAA
   AB              BA
   BC              CC
   BC              CA    
   BG              A        
   RF              D

и желаемым выводом является df3:

   IDs          Value1      Value2        Issue     
   AB              1          3             AA
   AB              1          1             AAA
   AB              2          4             BA
   BC              2          2             CC
   BC              5          0             CA
   BG              1          1             A
   RF              2          2             D

В настоящее время следующее:

df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='inner')
df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='left')
df3 = pd.merge(df1,df2,left_on='IDs',right_on='IDs',how='outer')

не работают, так как ониполучить результат, подобный следующему:

   IDs          Value1      Value2        Issue     
   AB              1          3             AA
   AB              1          1             AA
   AB              2          4             AA
   BC              2          2             CC
   BC              5          0             CC
   BG              1          1             A
   RF              2          2             D

, означающий, что они дублируют первое значение поля Issue из df2.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Вы можете использовать pd.concat для буквального объединения по индексу фрейма данных.Это означает, что оба ваших фрейма данных должны быть предварительно упорядочены, и вы просто «вставляете» один фрейм данных рядом с другим.

pd.concat([df1, df2[['Issue']], axis=1)

Вывод:

  IDs  Value1  Value2 Issue
0  AB       1       3    AA
1  AB       1       1   AAA
2  AB       2       4    BA
3  BC       2       2    CC
4  BC       5       0    CA
5  BG       1       1     A
6  RF       2       2     D
0 голосов
/ 24 сентября 2018

Используйте cumcount для столбца счетчика в обоих DataFrame с и добавьте этот столбец в параметр on в merge:

df1['g'] = df1.groupby('IDs').cumcount()
df2['g'] = df2.groupby('IDs').cumcount()

df3 = pd.merge(df1,df2,on=['IDs', 'g']).drop('g', axis=1)
print (df3)
  IDs  Value1  Value2 Issue
0  AB       1       3    AA
1  AB       1       1   AAA
2  AB       2       4    BA
3  BC       2       2    CC
4  BC       5       0    CA
5  BG       1       1     A
6  RF       2       2     D

Подробности :

print (df1)
  IDs  Value1  Value2  g
0  AB       1       3  0
1  AB       1       1  1
2  AB       2       4  2
3  BC       2       2  0
4  BC       5       0  1
5  BG       1       1  0
6  RF       2       2  0

print (df2)
  IDs Issue  g
0  AB    AA  0
1  AB   AAA  1
2  AB    BA  2
3  BC    CC  0
4  BC    CA  1
5  BG     A  0
6  RF     D  0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...