python - 在数据框中查找每月重复值( Pandas )

标签 python pandas dataframe time-series python-3.6

所以我有一个数据集,其中包含与这些日期相对应的日期和值。

date  value  category
1951-07 199 1
1951-07 130 3
1951-07 50  5
1951-08 199 1
1951-08 50  5
1951-08 199 1
1951-09 184 2
1951-09 50  5
1951-09 13  13

现在我的目标是找到每个月重复的值。 产生这样的框架:

date  value  category
1951-07 50  5
1951-08 50  5
1951-09 50  5

也不考虑在一个月内重复的值,或者只重复几个月但不是全部的值。

类别通常会与值配对(如示例所示),但有时它们不会。所以我试着按类别来做,但它没有给我确切的结果。

我目前的方法是过滤重复项,然后获取重复项,这些重复项会出现 12 次(因为我每年都在搜索)。但它也给了我值(value),即在一个月内重复 12 面。

df = df[df.duplicated(['value'],keep=False)]
v = df.value.value_counts()
df_12 = df[df.value.isin(v.index[v.gt(12)])]

如有任何帮助,我们将不胜感激。

最佳答案

我会首先按值分组并删除日期重复项:

tmp = df.groupby('value')['date'].apply(lambda x: x.drop_duplicates())

你的样本会给出:

value   
13     8    1951-09
50     2    1951-07
       4    1951-08
       7    1951-09
130    1    1951-07
184    6    1951-09
199    0    1951-07
       3    1951-08
Name: date, dtype: object

然后我们可以安全地计算值,只保留具有预期计数的值::

total = tmp.groupby(level=0).count()
total = total[total == 3]

我们得到:

value
50    3
Name: date, dtype: int64

我们最终可以过滤原始数据框:

df[df['value'].isin(total.index)]

给出预期:

      date  value  category
2  1951-07     50         5
4  1951-08     50         5
7  1951-09     50         5

根据 Jezrael 的评论,构建total 的第一步应该是:

total = df.drop_duplicates(['date', 'value'])[['date', 'value']
                                              ].groupby('value').count()['date']
total = total[total == 3]

它既简单又快速...

关于python - 在数据框中查找每月重复值( Pandas ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60543597/

相关文章:

python - 可以通过 Python 代码提取 git repo 修订散列吗?

python - 如何在 Pandas 中按组扩展窗口

python - 删除 Pandas 列名称中的小数

python - 如何进行这个 pandas 查询?

python - 从 R 到 Python : define multiple columns from multiple columns in a pandas dataframe

python - 如何在 Python 中将图像数组转换为二维数组

python 如何按数字=字符串对字符串列表进行排序

python - Pandas:multiIndex 数据帧上的部分索引不会重复行

python - 如何使字典的键作为合并数据框的索引?

python - 从 QComboBox 选择字符串并将 ID 插入 SQLite 数据库