Операция Pandas join / concat в одном соединяет фреймы данных - PullRequest
1 голос
/ 23 сентября 2019

У меня есть 3 кадра данных, которые выглядят следующим образом:

>>> a
                     val1
2018-03-04 12:40:00     1
2018-03-04 12:40:01     2
2018-03-04 12:40:02     3
>>> b
                     val2
2018-03-04 12:40:00     5
2018-03-04 12:40:01     2
2018-03-04 12:40:02     1
>>> c
                     val2
2018-03-04 12:40:03    -3
2018-03-04 12:40:04     2
2018-03-04 12:40:05     6

Я хотел бы объединить их в один кадр данных, который выглядит следующим образом:

>>> df
                     val1  val2
2018-03-04 12:40:00     1     5
2018-03-04 12:40:01     2     2
2018-03-04 12:40:02     3     1
2018-03-04 12:40:03   NaN    -3
2018-03-04 12:40:04   NaN     2
2018-03-04 12:40:05   NaN     6

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

Использование join не работает:

>>> a.join(c)
                     val1  val2
2018-03-04 12:40:00     1   NaN
2018-03-04 12:40:01     2   NaN
2018-03-04 12:40:02     3   NaN

Использование concat в сочетании с join по-прежнему не работает, и просто показывает, что join все равно не справится с работой, поскольку вместо замены NaN создается еще одинcolumn

>>> pd.concat([a,c]).join(b, lsuffix='_x', rsuffix='_y')
                     val1  val2_x  val2_y
2018-03-04 12:40:00   1.0     NaN     5.0
2018-03-04 12:40:01   2.0     NaN     2.0
2018-03-04 12:40:02   3.0     NaN     1.0
2018-03-04 12:40:03   NaN    -3.0     NaN
2018-03-04 12:40:04   NaN     2.0     NaN
2018-03-04 12:40:05   NaN     6.0     NaN

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

Я способен сделать это в Python, но я хотел знать, было ли решение для панд первым, так как панды более эффективны и быстрее.

Ответы [ 2 ]

1 голос
/ 23 сентября 2019
df= pd.concat([a,c]) 
df.update(b)

Выход

                     val1  val2
2018-03-04 12:40:00   1.0   5.0
2018-03-04 12:40:01   2.0   2.0
2018-03-04 12:40:02   3.0   1.0
2018-03-04 12:40:03   NaN  -3.0
2018-03-04 12:40:04   NaN   2.0
2018-03-04 12:40:05   NaN   6.0
1 голос
/ 23 сентября 2019

Попробуйте:

df=pd.concat([a,b,c],sort=False)
df.groupby(df.index).first()

Или:

pd.concat([a,b,c],sort=True).max(level=0)

Или, если есть только эти 3 DFS, вы также можете попробовать combine_first:

a.combine_first(b).combine_first(c)

                     val1  val2
2018-03-04 12:40:00   1.0   5.0
2018-03-04 12:40:01   2.0   2.0
2018-03-04 12:40:02   3.0   1.0
2018-03-04 12:40:03   NaN  -3.0
2018-03-04 12:40:04   NaN   2.0
2018-03-04 12:40:05   NaN   6.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...