Python 删除字符串中的第一个单词,具体取决于字符串中上述行的值

Python 删除字符串中的第一个单词,具体取决于字符串中上述行的值,python,pandas,Python,Pandas,我有下面的数据框 +---------------------+ | Col | +---------------------+ | CATEGORY A | | asdwed hello | | 8771asd how are you | | CATEGORY B | | hello how are you | +---------------------+ d = {'col': ['CATEGORY A

我有下面的数据框

+---------------------+
|         Col         |
+---------------------+
| CATEGORY A          |
| asdwed hello        |
| 8771asd how are you |
| CATEGORY B          |
| hello how are you   |
+---------------------+
d = {'col': ['CATEGORY A', 'asdwed hello', '8771asd how are you', 'CATEGORY B', 'hello how are you']}
df = pd.DataFrame(data=d)
我试图完成的是仅删除某些行的第一个单词。也就是说,对于
类别A
下面的行,我应该删除第一个单词,但是对于
类别B
下面的行,我不应该删除第一个单词

可以假设类别下面的行永远不会与类别本身具有相同的字符串值

因此,输出数据帧如下所示

+---------------------+
|         Col         |
+---------------------+
| CATEGORY A          |
| hello               |
| how are you         |
| CATEGORY B          |
| hello how are you   |
+---------------------+
下面是数据框

+---------------------+
|         Col         |
+---------------------+
| CATEGORY A          |
| asdwed hello        |
| 8771asd how are you |
| CATEGORY B          |
| hello how are you   |
+---------------------+
d = {'col': ['CATEGORY A', 'asdwed hello', '8771asd how are you', 'CATEGORY B', 'hello how are you']}
df = pd.DataFrame(data=d)

什么是实现这一点的最具python风格的方法?

我们可以利用智能掩蔽和字符串操作来创建布尔数组,最后使用
loc
来设置值

m1 = df['col'].eq('CATEGORY A')
m2 = df['col'].str.startswith('CATEGORY')
mask = m1.cumsum().eq(m2.cumsum()) & ~m1

df.loc[mask, 'col'] = df.loc[mask, 'col'].str.split(n=1).str[1]


                 col
0         CATEGORY A
1              hello
2        how are you
3         CATEGORY B
4  hello how are you

我们可以利用智能掩蔽和字符串操作来创建布尔数组,最后使用
loc
来设置值

m1 = df['col'].eq('CATEGORY A')
m2 = df['col'].str.startswith('CATEGORY')
mask = m1.cumsum().eq(m2.cumsum()) & ~m1

df.loc[mask, 'col'] = df.loc[mask, 'col'].str.split(n=1).str[1]


                 col
0         CATEGORY A
1              hello
2        how are you
3         CATEGORY B
4  hello how are you

这是相当放松和漫长的@埃尔凡的答案更短,更容易理解

box = (df
      .assign(category=lambda x: np.where(x.Col.str.contains("CATEGORY"), x.Col, np.nan))
      .ffill()
      .query("Col != category")
      .assign(Col=lambda x: np.where(x.category == "CATEGORY A",
                                     x.Col.str.split(n=1).str[-1], x.Col))
      .drop("category", 1))


#update the values of df : 
df.update(box)

df

    Col
0   CATEGORY A
1         hello
2   how are you
3   CATEGORY B
4   hello how are you

这是相当放松和漫长的@埃尔凡的答案更短,更容易理解

box = (df
      .assign(category=lambda x: np.where(x.Col.str.contains("CATEGORY"), x.Col, np.nan))
      .ffill()
      .query("Col != category")
      .assign(Col=lambda x: np.where(x.category == "CATEGORY A",
                                     x.Col.str.split(n=1).str[-1], x.Col))
      .drop("category", 1))


#update the values of df : 
df.update(box)

df

    Col
0   CATEGORY A
1         hello
2   how are you
3   CATEGORY B
4   hello how are you
试试这个

start = df.col.eq("CATEGORY A").idxmax() + 1  
end = df.col.eq("CATEGORY B").idxmax() - 1

df.loc[start:end, 'col'] = df.loc[start:end, 'col'].str.replace("^(.*?)\s", "")

试试这个

start = df.col.eq("CATEGORY A").idxmax() + 1  
end = df.col.eq("CATEGORY B").idxmax() - 1

df.loc[start:end, 'col'] = df.loc[start:end, 'col'].str.replace("^(.*?)\s", "")


groupby
包含字符串和筛选器
CATEGORY A
以及备用项。替换包含
字符串A
的组中子字符串中的第一个单词,并合并两个数据帧

df2=df.groupby(df.col.str.contains('CATEGORY').cumsum()).filter(lambda x:x['col'].str.contains('CATEGORY A').any())
df2.iloc[1:,:].replace(regex=r'(^[^ ]+)',value="", inplace=True)
    
df2.append(df.groupby(df.col.str.contains('CATEGORY').cumsum()).filter(lambda x:~x['col'].str.contains('CATEGORY A').any()))



               col
0           CATEGORY A
1              hello
2        how are you
3           CATEGORY B
4  hello how are you

groupby
包含字符串和筛选器
CATEGORY A
以及备用项。替换包含
字符串A
的组中子字符串中的第一个单词,并合并两个数据帧

df2=df.groupby(df.col.str.contains('CATEGORY').cumsum()).filter(lambda x:x['col'].str.contains('CATEGORY A').any())
df2.iloc[1:,:].replace(regex=r'(^[^ ]+)',value="", inplace=True)
    
df2.append(df.groupby(df.col.str.contains('CATEGORY').cumsum()).filter(lambda x:~x['col'].str.contains('CATEGORY A').any()))



               col
0           CATEGORY A
1              hello
2        how are you
3           CATEGORY B
4  hello how are you

示例数据框具有
字符串A
和打印数据框具有
类别A
示例数据框具有
字符串A
和打印数据框具有
类别A
是的索引偏移量应该是一个变量,对于特定类别,它可能不总是一行或两行。EAH索引偏移量应该是一个变量,对于某个类别,它可能并不总是一行或两行