这是我的DataFrame:

import pandas as pd

df = pd.DataFrame(
    {
        'a': ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z', 'p', 'p', 'p', 'p'],
        'b': [1, -1, 1, 1, -1, 1, 1, -1, -1, -1, -1, 1, 1, 1, 1]
    }
)

这是预期的yields .我想创建第c列:

    a  b    c
0   x  1    first
1   x -1    first
2   x  1    first
3   x  1    first
4   y -1    second
5   y  1    second
6   y  1    second
7   y -1    second
11  p  1    first
12  p  1    first
13  p  1    first
14  p  1    first

组由列a定义.我要筛选df,并 Select 第一个b为1或第二个b为1的组.

我是通过这个代码做到的:

df1 = df.groupby('a').filter(lambda x: (x.b.iloc[0] == 1) | (x.b.iloc[1] == 1))

为了为df1创建列c,同样应该由a来定义组,然后,如果对于每个组,第一个b是1,则cfirst,如果第二个b是1,则csecond.

请注意,对于组p,第一个和第二个b都是1,对于这些组,我希望cfirst.

也许我处理这个问题的方式是完全错误的.

推荐答案

一个泛型方法,适用于前1个位置的任意数量:

d = {0: 'first', 1: 'second'}

s = (df.groupby('a')['b']
       .transform(lambda g: g.reset_index()[g.values==1]
                  .first_valid_index())
       .replace(d)
     )

out = df.assign(c=s).dropna(subset=['c'])

备注:

  • 如果go 掉replace的步长,你将得到c中的一个整数
  • 如果使用map代替replace,则可以忽略未定义为字典键的位置

输出:

    a  b       c
0   x  1   first
1   x -1   first
2   x  1   first
3   x  1   first
4   y -1  second
5   y  1  second
6   y  1  second
7   y -1  second
11  p  1   first
12  p  1   first
13  p  1   first
14  p  1   first

comments 中的示例:

df = pd.DataFrame({'a': ['x', 'x', 'x', 'x', 'y', 'y', 'y', 'y', 'z', 'z', 'z', 'p', 'p', 'p', 'p'],
                  'b': [1, -1, 1, 1, -1, 1, 1, -1, -1, -1, 1, 1, 1, 1, 1]})

d = {0: 'first', 1: 'second'}

s = (df.groupby('a')['b']
       .transform(lambda g: g.reset_index()[g.values==1]
                  .first_valid_index())
       .map(d)
     )

out = df.assign(c=s).dropna(subset=['c'])

    a  b       c
0   x  1   first
1   x -1   first
2   x  1   first
3   x  1   first
4   y -1  second
5   y  1  second
6   y  1  second
7   y -1  second
11  p  1   first
12  p  1   first
13  p  1   first
14  p  1   first

您也可以仅使用以下选项筛选行:

m1 = df.groupby('a').cumcount().le(1)
m2 = df['b'].eq(1)
out = df.loc[df['a'].isin(df.loc[m1&m2, 'a'])]

Python相关问答推荐

pandas DataFrame GroupBy.diff函数的意外输出

重新匹配{ }中包含的文本,其中文本可能包含{{var}

删除任何仅包含字符(或不包含其他数字值的邮政编码)的观察

如何列举Pandigital Prime Set

如何在Polars中从列表中的所有 struct 中 Select 字段?

创建可序列化数据模型的最佳方法

使用Python从URL下载Excel文件

使用特定值作为引用替换数据框行上的值

如何排除prefecture_related中查询集为空的实例?

(Python/Pandas)基于列中非缺失值的子集DataFrame

OpenGL仅渲染第二个三角形,第一个三角形不可见

从源代码显示不同的输出(机器学习)(Python)

使用类型提示进行类型转换

在Python中控制列表中的数据步长

有没有办法让Re.Sub报告它所做的每一次替换?

在我融化极点数据帧之后,我如何在不添加索引的情况下将其旋转回其原始形式?

合并相似列表

多个矩阵的张量积

如何在Python中解析特定的文本,这些文本包含了同一行中的所有内容,

当lambda函数作为参数传递时,pyo3执行