3

这是我从文档中不太确定的事情。

假设我有两个数据框,数据重叠。

DF1 的 DateTimeIndex 开始于 07:00:00,结束于 09:30:00。

DF2 的 DateTimeIndex 开始于 07:00:00,结束于 11:30:00。

DF2 是更新后的 DF1,但与 DF1 相比,可能会在 DF1 的结束时间之前添加一些行。所以 DF2 可能在更新时从 9:20:00-9:30:00 添加了 200 行,然后 09:30:00 之后的所有内容当然也是新的。

如果我使用:

DF1.append(DF2)

我会从 DF2 中获得所有新的行吗?还是熊猫只在 DF1 结束后进入并取行?除此之外,DF2 添加实际上可能与 DF1 行在同一时间,但它会有不同的内容。熊猫也会处理这个吗?

如果熊猫不处理这个问题,我自己最好的方法是什么?

In [489]: df
Out[489]:
                     Row1  Row3
2013-11-05 08:00:00     2   NaN
2013-11-05 09:00:00     4   NaN
2013-11-05 09:06:00     6     5

In [490]: df2
Out[490]:
                     Row1  Row3
2013-11-05 08:00:00     2   NaN
2013-11-05 09:00:00     5   NaN
2013-11-05 09:09:00     6     5

In [491]: df.append(df2)
Out[491]:
                     Row1  Row3
2013-11-05 08:00:00     2   NaN
2013-11-05 09:00:00     4   NaN
2013-11-05 09:06:00     6     5
2013-11-05 08:00:00     2   NaN
2013-11-05 09:00:00     5   NaN
2013-11-05 09:09:00     6     5

在这种情况下,我希望 df.append(df2) 为:

In [491]: df.append(df2)
Out[491]:
                     Row1  Row3
2013-11-05 08:00:00     2   NaN
2013-11-05 09:00:00     4   NaN
2013-11-05 09:06:00     6     5
<strike>2013-11-05 08:00:00     2   NaN</strike>
2013-11-05 09:00:00     5   NaN
2013-11-05 09:09:00     6     5

编辑2:

我以前是这样做的:

last = df.ix[-1].name
to_append = df2[last:]
new_df = df.append(to_append)

不幸的是,这会删除新的行,但在我之前的 DataFrame 的最后一行的时间戳之前

4

1 回答 1

4

Append 类似于 python 之一list,您会将两个数据帧“堆叠”在一起。在具有重复的索引的情况下是否ValueError引发 a 由verify_integrity参数控制 to append,默认为False

>>> df = pd.DataFrame.from_dict({'col':{'row': 1}})
>>> df
     col
row    1
>>> df.append(df).index
Index([u'row', u'row'], dtype=object)
>>> df.append(df)
     col
row    1
row    1

>>> df.append(df, verify_integrity=True)
Traceback (most recent call last):
   ...
ValueError: Indexes have overlapping values: ['row']

与替换使用合并combine_first

>>> mdf = pd.DataFrame.from_dict({'col':{'row': 2, 'new':3}})
>>> df.combine_first(mdf) # values from df overwrite those of mdf
     col
new    3
row    1
>>> mdf.combine_first(df) # values from mdf overwrite those of df
     col
new    3
row    2

作为参考,这里是关于数据帧的不同合并和连接方式的广泛指南

更新

跟进:如果您希望行为类似于SQL union,一种方法可能是:

>>> df = pd.DataFrame.from_dict({'col':{'row': 1, 'new': 3}})
>>> mdf.append(df).drop_duplicates()
     col
new    3
row    2
row    1

或者,如果您想考虑索引,

>>> mdf['index'] = mdf.index
>>> df['index'] = df.index
>>> union = mdf.append(df).drop_duplicates()
>>> del union['index']
>>> union
     col
new    3
row    2
row    1
于 2013-11-05T21:08:04.243 回答