为了账号安全,请及时绑定邮箱和手机立即绑定

提取句点“.”后的文本 来自 Pandas Dataframes 列中的值

提取句点“.”后的文本 来自 Pandas Dataframes 列中的值

紫衣仙女 2023-08-08 10:35:40
我在数据框中有一列,如下所示:| Category |------------| B5050.88| 5051.90| B5050.97Q| 5051.23B| 5051.78E| B5050.11| 5051.09| Z5052我想提取句号后的文本。例如,从B5050.88开始,我只想要“88”;从5051.78E开始,我只想要“78E”;对于 Z50502,这没什么,因为没有句号。预期输出:| Category | Digits |---------------------| B5050.88 | 88  || 5051.90  | 90  || B5050.97Q| 97Q || 5051.23B | 23B || 5051.78E | 78E || B5050.11 | 11  || 5051.09  | 09  || Z5052    | -   |我尝试使用这个df['Digits'] = df.Category.str.extract('.(.*)')但我没有得到正确的答案。使用上述内容,对于 B5050.88,我得到相同的 B5050.88;对于 5051.09,我得到 NaN。如果没有文本,则基本上为 NaN。
查看完整描述

4 回答

?
守着一只汪

TA贡献1872条经验 获得超3个赞

你可以做


splits = [str(p).split(".") for p in df["Category"]]

df["Digits"] = [p[1] if len(p)>1 else "-" for p in splits]


IE



df = pd.DataFrame({"Category":["5050.88","5051.90","B5050.97","5051.23B","5051.78E",

"B5050.11","5051.09","Z5052"]})


#df


#   Category

# 0 5050.88

# 1 5051.90

# 2 B5050.97

# 3 5051.23B

# 4 5051.78E

# 5 B5050.11

# 6 5051.09

# 7 Z5052


splits = [str(p).split(".") for p in df["Category"]]

splits


# [['5050', '88'],

 # ['5051', '90'],

 # ['B5050', '97'],

 # ['5051', '23B'],

 # ['5051', '78E'],

 # ['B5050', '11'],

 # ['5051', '09'],

 # ['Z5052']]


df["Digits"] = [p[1] if len(p)>1 else "-" for p in splits]

df


# Category  Digits

# 0 5050.88     88

# 1 5051.90     90

# 2 B5050.97    97

# 3 5051.23B    23B

# 4 5051.78E    78E

# 5 B5050.11    11

# 6 5051.09     09

# 7 Z5052        -


不太漂亮,但很有效


编辑:


添加了“-”而不是 NaN 和代码片段


查看完整回答
反对 回复 2023-08-08
?
摇曳的蔷薇

TA贡献1793条经验 获得超6个赞

试试下面:

df['Category'].apply(lambda x : x.split(".")[-1] if "." in list(x) else "-")

检查下面的代码

https://img1.sycdn.imooc.com//64d1aa4c0001813c08960470.jpg

查看完整回答
反对 回复 2023-08-08
?
凤凰求蛊

TA贡献1825条经验 获得超4个赞

其他方式


df.Category.str.split('[\.]').str[1]


0     88

1     90

2    97Q

3    23B

4    78E

5     11

6     09

7    NaN

或者


df.Category.str.extract('((?<=[.])(\w+))')


查看完整回答
反对 回复 2023-08-08
?
LEATH

TA贡献1936条经验 获得超6个赞

你需要逃避你的第一个.并做fillna:


df["Digits"] = df["Category"].astype(str).str.extract("\.(.*)").fillna("-")

print(df)

输出:


    Category Digits

0   B5050.88     88

1    5051.90     90

2  B5050.97Q    97Q

3   5051.23B    23B

4   5051.78E    78E

5   B5050.11     11

6    5051.09     09

7      Z5052      -


查看完整回答
反对 回复 2023-08-08
  • 4 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信