Pandas - 每行子字符串长度不同的子串

6

你好,

我有一个数据框,想要为该列中的每一行隔离字符串的一部分。我的问题在于每一行需要保留不同长度的子字符串,具体地说,我只想保留字符串直到第一个出现的 "."(句号) 加上接下来的两个字母

例如:

import pandas as pd

x = [ [ 34, 'Sydney.Au123XX'] ,
             [30, 'Delhi.As1q' ] ,
             [16, 'New York.US3qqa']]
x = pd.DataFrame(x)
x.columns = ["a", "b"]

#now I want to substring each row based on where "." occurs.
#I have tried the following:
y = x["b"].str.slice( stop = x["b"].str.find(".") + 2)
y = x["b"].str[0: x["b"].str.find(".")+ 2]

#desired output
desired = [[ 34, 'Sydney.Au'] ,
             [30, 'Delhi.As' ] ,
             [16, 'New York.US'] ]
desired  = pd.DataFrame(desired )
desired .columns = ["a", "b"] 

请查看我的代码以获取所需输出。
我不想使用循环。
提前致谢。

为什么纽约在 . 后面有东西? - U13-Forward
@U10-Forward。谢谢,我看到了你的答案,对于我问题的第一个版本是正确的。请查看我的问题更新。str.split()可以用于保留“.”后的前两个字符的情况吗? - rich
@U10-Forward。我认为对于我的修改后的问题,我可以保留 x['b'].str.split('.').str[1] 来保留 "." 后的前两个字母。有更好的方法吗? - rich
2个回答

4

IIUC try:

x['b'] = x['b'].str.split('.').str[0]
print(x)

另外,您也可以使用单行代码:

print(x.assign(b=x['b'].str.split('.').str[0]))

他们都输出:
    a         b
0  34    Sydney
1  30     Delhi
2  16  New York

编辑:

应该做的:

x['b'] = x['b'].str.extract('(.*\...)')
print(x)

或使用:
print(x.assign(b=x['b'].str.extract('(.*\...)')))

0
使用列表推导式 示例
import pandas as pd

x = [ [ 34, 'Sydney.Au123'] ,
             [30, 'Delhi.As1' ] ,
             [16, 'New York.US3']]

data = [["{0}.{1}".format(i.split(".")[0],i.split(".")[1][0:2]) if isinstance(i,str) else i for i in y] for y in x ]
df  = pd.DataFrame(data,columns=['a','b'])
print(df)

输出:

    a            b
0  34    Sydney.Au
1  30     Delhi.As
2  16  New York.US

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接