Я знаю, что это простая проблема, но я застрял в ней довольно давно. У меня есть два DataFrame, которые имеют тысячи строк ОС, но вот пример:

df1 = 

Name    Value    Date
x        0.04    2014-01-02
x        0.03    2014-01-03
x        0.02    2014-01_05
x        0.02    2014-01-07
(...)    (...)      (...)
y        0.002   2014-01-01
y        0.001   2014-01-02
y        0.003   2014-01-03
y        0.004   2014-01-07
(...)     (...)     (...)
z        0.003   2014-01-02
z        0.003   2014-01-05
z        0.004   2014-01-07
(...)     (...)      (...)

И еще один Dataframe:

df2 = 

  Name    Value    Date
    x        0.04    2015-01-02
    x        0.03    2015-01-03
    x        0.02    2015-01_05
    x        0.02    2015-01-07
    (...)    (...)      (...)
    y        0.002   2015-01-01
    y        0.001   2015-01-02
    y        0.003   2015-01-03
    y        0.004   2015-01-07
    (...)     (...)     (...)
    z        0.003   2015-01-02
    z        0.003   2015-01-05
    z        0.004   2015-01-07
    (...)     (...)      (...)

что я хочу :

df3=
   Name    Value    Date
    x        0.04    2014-01-02
    x        0.03    2014-01-03
    x        0.02    2014-01_05
    x        0.02    2014-01-07
    x        0.04    2015-01-02
    x        0.03    2015-01-03
    x        0.02    2015-01_05
    x        0.02    2015-01-07
    (...)    (...)      (...)
    y        0.002   2014-01-01
    y        0.001   2014-01-02
    y        0.003   2014-01-03
    y        0.004   2014-01-07
    y        0.002   2015-01-01
    y        0.001   2015-01-02
    y        0.003   2015-01-03
    y        0.004   2015-01-07
    (...)     (...)     (...)
    z        0.003   2014-01-02
    z        0.003   2014-01-05
    z        0.004   2014-01-07
    z        0.003   2015-01-02
    z        0.003   2015-01-05
    z        0.004   2015-01-07
    (...)     (...)      (...)

1) при слиянии, если "name" отсутствует в данных за 2014 год, я хочу, чтобы он не присутствовал в моем df3, и то же самое с моими данными за 2015 год.

Другими словами, я хочу только "Name", который имеет значение в обоих моих Dataframes.

Что я пробовал:

{{Х0}} И

frames= [df1,df2]
df3= pd.concat([frames],axis=1)

но что мне дают как вывод:

df3 = 

Value_x     Date_y    Name    Value_y    Date_y 
  0.03    2014-01-02    x        0.04    2015-01-02
  0.02    2014-01-05    x        0.03    2015-01-03
  0.03    2014-01-06    x        0.02    2015-01_05
  0.03    2014-01-07    x        0.02    2015-01-07
  (...)     (...)     (...)      (...)     (...)    
   0.02   2014-01-03    y        0.002   2015-01-01
   0.01   2014-01-07    y        0.001   2015-01-02
   0.02   2014-01-06    y        0.003   2015-01-03
   00.2   2014-01-07    y        0.004   2015-01-07
  (...)     (...)     (...)      (...)     (...)
   0.03   2014-01-02   z        0.003   2015-01-02
   0.01   2014-01-04   z        0.003   2015-01-05
   0.03   2014-01-05   z        0.004   2015-01-07
  (...)      (...)     (...)     (...)   (...)
2
khouzam 20 Дек 2019 в 17:39

3 ответа

Ты можешь попробовать

df3 = pd.merge(df1, df2, left_on='Value', right_on='Value')
0
Kjell Zijlemaker 20 Дек 2019 в 15:03

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

Обратите внимание, что в этом примере я добавил 2014-01-08 дату как имя z в df1 - она не будет в конечном кадре данных, потому что 2015-01-08 не существует с таким именем в { { Х4 } } ) :

import pandas as pd

name_1 = ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z', 'z']
value_1 = [0.04, 0.03, 0.02, 0.02, 0.002, 0.001, 0.003, 0.004, 0.003, 0.003, 0.004, 0.009]
date_1 = ['2014-01-02', '2014-01-03', '2014-01-05', '2014-01-07', '2014-01-01', '2014-01-02', '2014-01-03', '2014-01-07', '2014-01-02', '2014-01-05', '2014-01-07', '2014-01-08']

name_2 = ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z']
value_2 = [0.04, 0.03, 0.02, 0.02, 0.002, 0.001, 0.003, 0.004, 0.003, 0.003, 0.004]
date_2 = ['2015-01-02', '2015-01-03', '2015-01-05', '2015-01-07', '2015-01-01', '2015-01-02', '2015-01-03', '2015-01-07', '2015-01-02', '2015-01-05', '2015-01-07']

df1 = pd.DataFrame({'Name':name_1, 'Value':value_1, 'Date': date_1})
df2 = pd.DataFrame({'Name':name_2, 'Value':value_2, 'Date': date_2})

df1['days'] = df1['Date'].str.split(r'\d{4}-(\d+-\d+)', expand=True)[1]
df2['days'] = df2['Date'].str.split(r'\d{4}-(\d+-\d+)', expand=True)[1]

df = pd.merge( df1,  df2, on=['Name', 'days'] )

df = df1[ df1.set_index( ['Name', 'Date'] ).index.isin( df.set_index( ['Name', 'Date_x']).index ) ].append(
        df2[ df2.set_index( ['Name', 'Date'] ).index.isin( df.set_index( ['Name', 'Date_y']).index ) ]
    ).sort_values(['Name', 'Date']).reset_index(drop=True)
del df['days']

print(df)

Печать :

   Name  Value        Date
0     x  0.040  2014-01-02
1     x  0.030  2014-01-03
2     x  0.020  2014-01-05
3     x  0.020  2014-01-07
4     x  0.040  2015-01-02
5     x  0.030  2015-01-03
6     x  0.020  2015-01-05
7     x  0.020  2015-01-07
8     y  0.002  2014-01-01
9     y  0.001  2014-01-02
10    y  0.003  2014-01-03
11    y  0.004  2014-01-07
12    y  0.002  2015-01-01
13    y  0.001  2015-01-02
14    y  0.003  2015-01-03
15    y  0.004  2015-01-07
16    z  0.003  2014-01-02
17    z  0.003  2014-01-05
18    z  0.004  2014-01-07
19    z  0.003  2015-01-02
20    z  0.003  2015-01-05
21    z  0.004  2015-01-07
0
Andrej Kesely 20 Дек 2019 в 16:09

Используйте pd.append: вы можете сделать

#...

df = df1.append(df2, ignore_index=True)

# or more dfs list
df = df1.append([df2, df3], ignore_index=True)

для получения дополнительной информации см. документацию https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.append.html

0
Prayson W. Daniel 20 Дек 2019 в 15:06