【问题标题】:Pandas Append BehaviorPandas 追加行为
【发布时间】:2013-11-16 20:42:19
【问题描述】:

这是我从文档中不太确定的内容。

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

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 行在同一时间,但它会有不同的内容。熊猫也会处理这个吗?

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

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 的最后一行的时间戳之前

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    Append 类似于 python list 之一,您会将两个数据帧“堆叠”在一起。在索引重复的情况下是否引发ValueErrorverify_integrity参数控制到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
    

    作为参考,这里是extensive guide关于数据帧的不同合并和连接方式

    更新

    跟进:如果您希望行为类似于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,除了它会跳过那些重复的,但它还会检查每一列以确保它不仅在索引中而且在内容中都是重复的,如果不是,那么它也会加入df
    • @user1610719 你应该添加一个你期望的例子,你的评论不清楚
    • 不知道怎么打但是我加了
    • 不确定如何描述它,但我想要的是:合并两个数据帧,即使它们具有相同的索引,但如果它们确实具有相同的索引,我不想在所有结果列时合并也匹配。所以合并除了那些完全重复的行之外的所有行
    • 我删掉了最后一个。通过使用 combine_first 合并,我会丢失 20k 行。所以上面两个 cmets 的方式是它对我有用的唯一方式。附加不起作用,因为它保留了所有的,我正在处理相同的 10m 行和 2k 更新的行以及比第一个 df 结束早的 200 行也不同。我还用我的旧方法进行了编辑
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-17
    • 2016-06-21
    • 1970-01-01
    • 2015-03-11
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多