python - Pandas 过滤数据框的正值和负值

标签 python pandas

我有一个包含 3 列的 pandas 数据框,其中:

  • 类别数据类型 - 字符串
  • 日期数据类型 - 日期时间
  • 值数据类型 - float

    df = pd.DataFrame()
    df['category'] = ['a', 'b', 'b', 'b', 'c', 'a', 'b', 'c', 'c', 'a']
    df['date'] = ['2018-01-01', '2018-01-01', '2018-01-03', '2018-01-05', '2018-01-01', '2018-01-02', '2018-01-06', '2018-01-03', '2018-01-04','2018-01-01']
    df['values'] = [1, 2, -1.5, 2.3, 5, -0.7, -5.2, -5.2, 1, -1.1]
    df
    

Dataframe view

我想过滤每个类别具有接近该日期的正值和负值(差异最小)的行。

因此,输出基本上如下所示:

df = pd.DataFrame()
df['category'] = ['a', 'a','b', 'b', 'c', 'c']
df['date'] = ['2018-01-01', '2018-01-01', '2018-01-01', '2018-01-03', '2018-01-01', '2018-01-03']
df['values'] = [1, -1.1, 2, -1.5, 5, -5.2]
df

Filtered Dataframe

我看过类似的查询( Identifying closest value in a column for each filter using PandasHow do I find the closest values in a Pandas series to an input number? )

第一个使用 idxmin,它返回第一个出现的值,而不是最接近的值。

第二个链接正在谈论作为输入的特定值 - 我认为纯 np.argsort 在我的情况下不起作用。

我可以想象使用复杂的 if 语句网络来执行此操作,但是,我不确定使用 pandas 执行此操作的最有效方法是什么。

任何指导将不胜感激。

最佳答案

IIUC,首先对数据帧进行排序,然后使用idxmin:

df1 = df.sort_values(['category','date'])
df1[df1.groupby('category')['values']\
       .transform(lambda x: x.index.isin([x.ge(0).idxmin(), x.lt(0).idxmin()]))]

输出:

  category        date  values
0        a  2018-01-01     1.0
9        a  2018-01-01    -1.1
1        b  2018-01-01     2.0
2        b  2018-01-03    -1.5
4        c  2018-01-01     5.0
7        c  2018-01-03    -5.2

关于python - Pandas 过滤数据框的正值和负值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52366048/

相关文章:

python - Pandas 中数据帧子集的随机样本

python - 带有 numpy.maximum 的 Pandas Datetimeindex 给出错误

python jira 无法转换问题

python - 有没有办法在 Altair boxplot 中格式化工具提示值

python - 使用 vispy 以灰度显示图像

python - 从行向量创建 block 矩阵的最佳方法是什么?

将 sys.stdout 缓冲区设置为零的 Python 标准习惯用法不适用于 Unicode

python - 合并后保留数据帧的顺序

Python Pandas 库按截断日期重新采样

python - 如何使用另一个过滤后的数据帧更新数据帧