Python 熊猫们,在最后一个'之后移除所有东西_';
我在下面的专栏中看到了以下类型的字符串。我想解析出每个字符串最后一个Python 熊猫们,在最后一个'之后移除所有东西_';,python,pandas,Python,Pandas,我在下面的专栏中看到了以下类型的字符串。我想解析出每个字符串最后一个\uu之后的所有内容,如果没有\u,则保持字符串不变。(正如我在下面尝试的那样,只会排除不带\uuu的字符串) 到目前为止,我已经尝试了以下内容,请参见:。但它只是在第一次之后解析出所有内容 d6['SOURCE\u NAME']=d6['SOURCE\u NAME'].str.split('uu').str[0] 下面是“我的源名称”列中的一些示例字符串 Stackoverflow_1234 Stack_Over_Flow_1
\uu
之后的所有内容,如果没有\u
,则保持字符串不变。(正如我在下面尝试的那样,只会排除不带\uuu
的字符串)
到目前为止,我已经尝试了以下内容,请参见:。但它只是在第一次之后解析出所有内容
d6['SOURCE\u NAME']=d6['SOURCE\u NAME'].str.split('uu').str[0]
下面是“我的源名称”列中的一些示例字符串
Stackoverflow_1234
Stack_Over_Flow_1234
Stackoverflow
Stack_Overflow_1234
预期:
Stackoverflow
Stack_Over_Flow
Stackoverflow
Stack_Overflow
任何帮助都将不胜感激。您可以尝试应用lambda,如下所示:
d6['SOURCE_NAME'] = df['SOURCE_NAME'].apply(lambda x: x.split('_')[0])
希望有帮助 您可以尝试这样应用lambda:
d6['SOURCE_NAME'] = df['SOURCE_NAME'].apply(lambda x: x.split('_')[0])
希望有帮助 使用rsplit()返回您想要实现的结果,您可以告诉它拆分字符串的次数
s = "Stack_Over_Flow_1234"
s.rsplit('_', 1)[0] # Split my string one time and get the first part of it
然后使用rsplit()返回'Stack\u Over\u Flow'
返回您想要实现的结果,您可以告诉它拆分字符串的次数
s = "Stack_Over_Flow_1234"
s.rsplit('_', 1)[0] # Split my string one time and get the first part of it
然后返回'Stack\u Over\u Flow'
使用str.rsplit
和str.get
的组合以获得所需的结果str.rsplit
仅从末尾拆分字符串,而str.get
获取pd.Series对象中迭代器的第n个元素
答复
d6['SOURCE\u NAME']=df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
rsplit
中的n
参数限制了输出中拆分的数量,因此您只保留最后一个'\u1'之前的所有内容
尽管使用pd.Series.apply
的解决方案的速度几乎是原来的一半,但我还是喜欢这个解决方案,因为它的语法更具表现力。如果您想使用pd.Series.apply
解决方案(更快),请检查定时部分
例子
strs=['Stackoverflow_1234',
“叠加在流量上”,
“堆栈溢出”,
'堆栈溢出\u 1234']
df=pd.DataFrame(数据={'SOURCE_NAME':strs})
这导致
print(df)
SOURCE_NAME
0 Stackoverflow_1234
1 Stack_Over_Flow_1234
2 Stackoverflow
3 Stack_Overflow_1234
使用提议的解决方案:
df['SOURCE\u NAME'].str.rsplit(''uu',1).str.get(0)
0堆栈溢出
1个堆栈溢出流
2堆垛溢出
3堆栈溢出
名称:源名称,数据类型:对象
时间
有趣的是,使用pd.Series.str不一定比使用pd.Series.apply快:
将熊猫作为pd导入
df=pd.DataFrame(数据={'SOURCE_NAME':['stackoverflow_1234_abcd']*1000})
%timeit df['SOURCE_NAME'].apply(lambda x:x.rsplit('uu',1)[0])
每个回路497µs±30.2µs(7次运行的平均值±标准偏差,每个1000个回路)
%timeit df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
每个回路1.04 ms±4.27µs(7次运行的平均值±标准偏差,每个1000个回路)
#增加行数x 100
df=局部固结([df]*100)
%timeit df['SOURCE_NAME'].apply(lambda x:x.rsplit('uu',1)[0])
每个回路31.7 ms±1.5 ms(7次运行的平均值±标准偏差,每个10个回路)
%timeit df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
每个回路84.1 ms±6.88 ms(7次运行的平均值±标准偏差,每个10个回路)
使用str.rsplit
和str.get
的组合来获得您想要的结果str.rsplit
仅从末尾拆分字符串,而str.get
获取pd.Series对象中迭代器的第n个元素
答复
d6['SOURCE\u NAME']=df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
rsplit
中的n
参数限制了输出中拆分的数量,因此您只保留最后一个'\u1'之前的所有内容
尽管使用pd.Series.apply
的解决方案的速度几乎是原来的一半,但我还是喜欢这个解决方案,因为它的语法更具表现力。如果您想使用pd.Series.apply
解决方案(更快),请检查定时部分
例子
strs=['Stackoverflow_1234',
“叠加在流量上”,
“堆栈溢出”,
'堆栈溢出\u 1234']
df=pd.DataFrame(数据={'SOURCE_NAME':strs})
这导致
print(df)
SOURCE_NAME
0 Stackoverflow_1234
1 Stack_Over_Flow_1234
2 Stackoverflow
3 Stack_Overflow_1234
使用提议的解决方案:
df['SOURCE\u NAME'].str.rsplit(''uu',1).str.get(0)
0堆栈溢出
1个堆栈溢出流
2堆垛溢出
3堆栈溢出
名称:源名称,数据类型:对象
时间
有趣的是,使用pd.Series.str不一定比使用pd.Series.apply快:
将熊猫作为pd导入
df=pd.DataFrame(数据={'SOURCE_NAME':['stackoverflow_1234_abcd']*1000})
%timeit df['SOURCE_NAME'].apply(lambda x:x.rsplit('uu',1)[0])
每个回路497µs±30.2µs(7次运行的平均值±标准偏差,每个1000个回路)
%timeit df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
每个回路1.04 ms±4.27µs(7次运行的平均值±标准偏差,每个1000个回路)
#增加行数x 100
df=局部固结([df]*100)
%timeit df['SOURCE_NAME'].apply(lambda x:x.rsplit('uu',1)[0])
每个回路31.7 ms±1.5 ms(7次运行的平均值±标准偏差,每个10个回路)
%timeit df['SOURCE\u NAME'].str.rsplit(''uu',n=1).str.get(0)
每个回路84.1 ms±6.88 ms(7次运行的平均值±标准偏差,每个10个回路)
您可以使用string.split(“”)函数将字符串拆分为围绕每个下划线的子字符串列表,然后在不使用最后一个元素的情况下重新组合它们。下面是一个使用您的示例的片段:
a = ["Stackoverflow_1234", "Stack_Over_Flow_1234", "Stackoverflow", "Stack_Overflow_1234"]
for e in a:
# Split the string into a list, separated at '_'
splitStr = e.split("_")
# If there is only 1 element, we can use it directly
if len(splitStr) == 1:
print(splitStr[0])
# Slice off the final substring and join the remaining
# substrings back together with underscores
else:
print("_".join(splitStr[:-1]))
可以使用string.split(“”)函数将字符串拆分为围绕每个下划线的子字符串列表,然后在不使用最后一个元素的情况下重新组合它们。下面是一个使用您的示例的片段:
a = ["Stackoverflow_1234", "Stack_Over_Flow_1234", "Stackoverflow", "Stack_Overflow_1234"]
for e in a:
# Split the string into a list, separated at '_'
splitStr = e.split("_")
# If there is only 1 element, we can use it directly
if len(splitStr) == 1:
print(splitStr[0])
# Slice off the final substring and join the remaining
# substrings back together with underscores
else:
print("_".join(splitStr[:-1]))
你好,小伙子n=1
是pd.Series.str.rsplit
方法上的一个参数,它在普通Python上的对应项为str.rsplit
,普通参数为maxslit=1
。这些参数只是从右侧限制拆分的数量。请注意,这些参数的默认值为-1
,这意味着不限制拆分的数量。如果我说pd.Series.s