python - 在 Pandas 中标记组内的第一个类别

标签 python pandas

我有一个包含两个组指示器的数据框:cat1 和 cat2。我想标记 cat2 在 cat1 中第一次出现的情况。

我有:

df = pd.DataFrame([['a','x'],['a','x'],['a','y'],['a','y'],['b','y'],['b','z'],['c','z']], columns = ['cat1', 'cat2'])

  cat1 cat2
0    a    x
1    a    x
2    a    y
3    a    y
4    b    y
5    b    z
6    c    z

我想获得什么:

  cat1 cat2 flag
0    a    x    1
1    a    x    1
2    a    y    0
3    a    y    0
4    b    y    1
5    b    z    0
6    c    z    1

我尝试过各种版本的分组滚动计数,但未能获得所需的结果。

谢谢!!!

最佳答案

您可以对“cat1”进行groupby,然后调用transform,它会应用一个lambda,将“cat2”的值与第一个值进行比较value,这将产生一个 bool 数组,然后我们可以使用 astype 将其转换为 int:

In [166]:
df['flag'] = df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0]).astype(int)
df

Out[166]:
  cat1 cat2  flag
0    a    x     1
1    a    x     1
2    a    y     0
3    a    y     0
4    b    y     1
5    b    z     0
6    c    z     1

在这里您可以看到 bool 输出:

In [167]:
df.groupby('cat1')['cat2'].transform(lambda x: x== x.iloc[0])

Out[167]:
0     True
1     True
2    False
3    False
4     True
5    False
6     True
Name: cat2, dtype: object

另一种方法是调用first比较中:

In [169]:
df['flag'] = (df['cat2'] == df.groupby('cat1')['cat2'].transform('first')).astype(int)
df

Out[169]:
  cat1 cat2  flag
0    a    x     1
1    a    x     1
2    a    y     0
3    a    y     0
4    b    y     1
5    b    z     0
6    c    z     1

关于python - 在 Pandas 中标记组内的第一个类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42676010/

相关文章:

python - 为什么在 google colab 中找不到模块?

python - 如何重新创建 pandas DataFrame、线条和条形图

python - 为什么 pd.to_datetime 根据是否指定格式使用不同的默认 Y/M/D

python - 将 pandas 与 praw 一起使用

python - 如何在不影响 Pandas 数据框中其他单元格的情况下从字符串中删除 0?

python - 识别非常低级别的图片并在 Python 中将其着色为纯黑色

android - 导入错误 : dlopen failed: has bad ELF magic

python - 装饰器不改变 dir()

python - 如何将 Pandas 时间序列转换为带有字符串键的字典

python - 在windows7中安装PIL时出现错误: Unable to find vcvarsall. bat