python - 如何根据 DataFrame 中前一行的值标记特定值?

标签 python pandas numpy

数据如下所示:

Ctgr
A
B
B
C
D
E
F

我正在寻找的结果是:

Ctgr|subctgr
  A |  A
  B |  A
  B |  A
  C |  A
  D |  D
  E |  D
  F |  D

也就是说subctgr是由每个“组”第一行的值决定的。
但是,我不知道如何区分 python 中的每个“组”,尽管它们由 NaN 值分隔。

最佳答案

拳头测试缺失行 Series.isna ,然后通过与 Series.shift 比较来获取 groups 的第一个值编辑掩码值并通过 ffill 创建由以前的值填充的新列。最后设置新列 numpy.where :

#for test missing values
m = df['Ctgr'].isna()
#for test emtsy strings
#m = df['Ctgr'].eq('')
df['subctgr'] = np.where(m,np.nan,df['Ctgr'].where(m.ne(m.shift())).ffill())
print (df)
  Ctgr subctgr
0    A       A
1    B       A
2    B       A
3    C       A
4  NaN     NaN
5    D       D
6    E       D
7    F       D

详细信息:

print (df.assign(m = df['Ctgr'].isna(),
                 mask = m.ne(m.shift()),
                 first = df['Ctgr'].where(m.ne(m.shift())),
                 ffill = df['Ctgr'].where(m.ne(m.shift())).ffill(),
                 subctgr = np.where(m,np.nan,df['Ctgr'].where(m.ne(m.shift())).ffill())))
  Ctgr      m   mask first ffill subctgr
0    A  False   True     A     A       A
1    B  False  False   NaN     A       A
2    B  False  False   NaN     A       A
3    C  False  False   NaN     A       A
4  NaN   True   True   NaN     A     NaN
5    D  False   True     D     D       D
6    E  False  False   NaN     D       D
7    F  False  False   NaN     D       D

关于python - 如何根据 DataFrame 中前一行的值标记特定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59597325/

相关文章:

python - 将文件名添加到 .csv 文件开头的第一列

python - RandomForest IndexError : only integers, slices (`:` ), ellipsis (`...` ), numpy.newaxis (`None` ) 和整数或 bool 数组是有效索引

python - 从 pandas dataframe 获取不带索引的列值

python - 亚马逊 API MWS 签名不匹配

python - 在 sklearn 的 Pipeline 中使用 LabelEncoder 给出 : fit_transform takes 2 positional arguments but 3 were given

python - 使用滚动窗口准确检测数据帧中具有重复值(相同头部和相同尾部)的序列

python - 如何重新采样/重新组织数据框

python - 创建一个 numpy 数组子类,其中所有形状更改操作都返回一个普通数组

python - 在 OpenCV 中更改 channel 顺序会阻止绘制矩形

python - 我希望能够使用日期查找特定的数据