gpt4 book ai didi

python - 识别数据框中除了来自多索引的日期索引值之外相同的行?

转载 作者:太空宇宙 更新时间:2023-11-04 01:51:47 25 4
gpt4 key购买 nike

我正在定期/每日拍摄数据快照。每个元素都有一个唯一的 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com