我正在定期/每天拍摄数据快照。每个元素都有唯一的ID号,但是元素的数据可以保持不变,也可以从一天到另一天变化。我想连接每天的快照,但是删除行,因为每一天到第二天都是相同的(日期除外)。

我研究了groupby()diff()ne()。我猜想解决方案可能是某种组合,但是我不确定。另外,还有一个问题是在连接之前比较数据帧以限制连接的对象,或者先连接然后再修剪结果数据帧。我以这样的假设进行工作:首先连接起来然后删除不符合给定条件的行会更容易。

这是一些示例数据。

import pandas as pd

d1 = {'id': [1, 2, 3, 4], 'b': ['abc', 'bcd', 'cde', 'def'], 'c': ['foo', 'foo', 'bar', 'bar'], 'date': ['20190909', '20190909', '20190909','20190909']}
d1['date'] = pd.to_datetime(d1['date'])
df1 = pd.DataFrame(d1)
df1.set_index(['id', 'date'], inplace=True)

d2 = {'id': [2, 3, 4, 5], 'b': ['bcd', 'cde', 'xyz', 'xxx'], 'c': ['foo', 'foo', 'bar', 'bar'], 'date': ['20190908', '20190908', '20190908','20190908']}
d2['date'] = pd.to_datetime(d2['date'])
df2 = pd.DataFrame(d2)
df2.set_index(['id', 'date'], inplace=True)


如果首先连接,则结果如下。

df3 = pd.concat([df1, df2])
df3
                 b    c
id date
1  2019-09-09  abc  foo
2  2019-09-09  bcd  foo
3  2019-09-09  cde  bar
4  2019-09-09  def  bar
2  2019-09-08  bcd  foo
3  2019-09-08  cde  foo
4  2019-09-08  xyz  bar
5  2019-09-08  xxx  bar


在此示例中,id == 2是除日期以外在所有方面都相同的唯一行。它出现了两次,但我只想保留它的最旧外观date == '2019-09-08'并删除较新的实例date == '2019-09-09'

我不知道如何以编程方式到达这里,但我想最终得到一个看起来像这样的数据框。

df3.drop([(2, '2019-09-09')])
                 b    c
id date
1  2019-09-09  abc  foo
3  2019-09-09  cde  bar
4  2019-09-09  def  bar
2  2019-09-08  bcd  foo
3  2019-09-08  cde  foo
4  2019-09-08  xyz  bar
5  2019-09-08  xxx  bar

最佳答案

由于要使用的多索引,您基本上需要.drop_duplicates(keep='last')有一些约束:

# Move 'id' from the index to a new column and drop duplicated values
result = df3.reset_index('id').drop_duplicates(keep='last')

# Reset the dataframe to the original structure
result.set_index(['id',result.index], drop=True)


请注意,我在这里使用keep='last'假定您的数据按降序排列。您可能需要先排序。

关于python - 是否确定数据框中的行与多索引中的日期索引值相同?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57860363/

10-12 18:14
查看更多