Слияние информации из строк с одинаковым индексом в одну строку с пандами - PullRequest
0 голосов
/ 25 января 2019

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

2018-11-22 Iraq 13984.75 3000.0 NaN
2018-11-22 Iraq NaN NaN Heavy Rain

Желаемый вывод:

2018-11-22 Iraq 13984.75 3000.0 Heavy Rain

Теперь я хочу объединить их в один. Почти каждое значение, как видно на изображении, просто присутствует в одной из строк, а другая имеет значение NaN на своем месте. Поэтому я хотел бы заменить NaN значением в другом ряду. Однако в этом случае могут быть значения, определенные в обеих строках, например, дата окончания, где я хотел бы сохранить большую.

Есть ли способ сделать это с пандами?

1 Ответ

0 голосов
/ 25 января 2019

Я считаю, что вам нужно:

df1 = pd.DataFrame({
        'A':list('abcdef'),
         'B':[4,np.nan,4,50,5,np.nan],
         'C':[7,np.nan,9,4,2,3],
         'E':[np.nan,30,60,9,np.nan,4],
         'F':['s','d','f',np.nan,'r',np.nan]
}, index=pd.date_range('2011-01-01', periods=6))


df2 = pd.DataFrame({
        'A':list('ertyui'),
         'B':[4,np.nan,6,5,5,8],
         'C':[7,np.nan,9,20,2,3],
         'E':[8,np.nan,3,6,90,np.nan],
         'F':[np.nan,'d',np.nan,'f','r',np.nan]
}, index=pd.date_range('2011-01-01', periods=6))

Первый concat оба DataFrames:

df = pd.concat([df1, df2])
print (df)
            A     B     C     E    F
2011-01-01  a   4.0   7.0   NaN    s
2011-01-02  b   NaN   NaN  30.0    d
2011-01-03  c   4.0   9.0  60.0    f
2011-01-04  d  50.0   4.0   9.0  NaN
2011-01-05  e   5.0   2.0   NaN    r
2011-01-06  f   NaN   3.0   4.0  NaN
2011-01-01  e   4.0   7.0   8.0  NaN
2011-01-02  r   NaN   NaN   NaN    d
2011-01-03  t   6.0   9.0   3.0  NaN
2011-01-04  y   5.0  20.0   6.0    f
2011-01-05  u   5.0   2.0  90.0    r
2011-01-06  i   8.0   3.0   NaN  NaN

Затем выберите только числовые столбцы с select_dtypes и агрегат max для индекса:

df11 = df.select_dtypes(np.number).max(level=0)
print (df11)
               B     C     E
2011-01-01   4.0   7.0   8.0
2011-01-02   NaN   NaN  30.0
2011-01-03   6.0   9.0  60.0
2011-01-04  50.0  20.0   9.0
2011-01-05   5.0   2.0  90.0
2011-01-06   8.0   3.0   4.0

Для агрегатов столбцов строк first - первое не NaN-значение для группы:

df12 = df.select_dtypes(object).groupby(level=0).first()
print (df12)
            A    F
2011-01-01  a    s
2011-01-02  b    d
2011-01-03  c    f
2011-01-04  d    f
2011-01-05  e    r
2011-01-06  f  NaN

Последнее объединение и для столбцов того же порядка используйте reindex:

out = pd.concat([df11, df12], axis=1).reindex(columns=df.columns)
print (out)
            A     B     C     E    F
2011-01-01  a   4.0   7.0   8.0    s
2011-01-02  b   NaN   NaN  30.0    d
2011-01-03  c   6.0   9.0  60.0    f
2011-01-04  d  50.0  20.0   9.0    f
2011-01-05  e   5.0   2.0  90.0    r
2011-01-06  f   8.0   3.0   4.0  NaN
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...