Python 熊猫追加行为

Python 熊猫追加行为,python,pandas,Python,Pandas,从文件上看,这是我不太确定的 假设我有两个数据帧,数据重叠 DF1有一个日期时间索引,从07:00:00开始,到09:30:00结束 DF2有一个日期时间索引,从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有一个日期时间索引,从07:00:00开始,到09:30:00结束

DF2有一个日期时间索引,从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

不幸的是,这会删除新的行,但在我之前的数据帧的最后一行的时间戳之前,Append类似于python
list
,您将两个数据帧“堆叠”在一起。如果索引具有重复项,则是否引发
ValueError
verify_integrity
param 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']
要与替换合并,请先使用“合并”:

>>> 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

我想我的要求比这更深入。我真正需要的是一个veryify_integrity=True,除了它会跳过那些重复的,但它也会检查每一列,以确保它不仅在索引中是重复的,而且在内容中也是重复的,如果不是,那么它将作为well@user1610719你应该手动添加一个你期望的示例,你的评论是不明确的,不确定如何删除,但我添加了它,不确定如何描述它,但我想要的是:合并两个数据帧,即使它们具有相同的索引,但如果它们具有相同的索引,我不希望在所有结果列也匹配时合并。因此,合并除了那些完全重复的行以外的所有行。我编辑掉了最后一行。如果先使用combine_进行合并,我会损失大约20k行。因此,上面两条评论的方式是唯一适合我的方式。Append不起作用,因为它保留了所有的数据,我处理的是10万行相同的数据,2千行更新的数据,以及比第一个df结束时间早200行的数据。我也用我以前的方式编辑
>>> 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