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索引偏移量应该是一个变量,对于某个类别,它可能并不总是一行或两行