Python 在列中拆分两种类型的字符串

Python 在列中拆分两种类型的字符串,python,pandas,string,strsplit,Python,Pandas,String,Strsplit,我在“1234/123456789/12/123”列和“1234/X/123456789/12/123”列中有两种类型的字符串。我想把它分成五列,这样每当字符串中有“X”时,它就会转到第二列,否则第2列将保持为空。 预期产量 Col1 Col2 Col3 Col4 Col5 1234 123456789 12 123 1234 X 123456789 12 123 想法是首先使用数据帧,重命名列,然后测试第二列(如果不

我在“1234/123456789/12/123”列和“1234/X/123456789/12/123”列中有两种类型的字符串。我想把它分成五列,这样每当字符串中有“X”时,它就会转到第二列,否则第2列将保持为空。 预期产量

Col1    Col2    Col3    Col4    Col5
1234         123456789  12      123
1234     X   123456789  12      123
想法是首先使用数据帧,
重命名
列,然后测试第二列(如果不等于
X
),然后使用
轴=1将第二列的所有列移位:

df = pd.DataFrame({'a':[ "1234/123456789/12/123", "1234/X/123456789/12/123"]})
 

df1 = df['a'].str.split('/', expand=True).rename(columns = lambda x: f'Col{x+1}')
m = df1['Col2'].ne('X').to_numpy()
df1.iloc[m, 1:] = df1.iloc[m, 1:].shift(axis=1).fillna('')
print (df1)
   Col1 Col2       Col3 Col4 Col5
0  1234       123456789   12  123
1  1234    X  123456789   12  123

我的方法是创建一个二维列表,然后将其作为数据帧加载。这里假设您的输入字符串属于您描述的两种情况之一:4列或5列,都以“/”作为delimter。对空条目使用numpy的nan值

#将一个字符串转换为列值列表
def stringToList(行字符串):
rowList=rowString.split(“/”)
如果len(行列表)==5:
返回(行列表)
如果len(行列表)==4:
行列表=[rowList[0]+[np.nan]+行列表[1::]
返回(行列表)
#将字符串列表转换为pd数据帧
def CONVERTODATAFRAME(列表字符串):
结果=[]
对于ListOfstring中的s:
结果.追加(字符串列表)
返回pd.DataFrame(结果)

还没有测试过,但请告诉我是否有效。您可以使用pd.DataFrame方法中的
column=
参数设置列名。

如果您愿意,可以使用regex完成此操作:

例如:

import pandas as pd
import re

# Create sample DataFrame
df = pd.DataFrame({'s': ["1234/123456789/12/123", "1234/X/123456789/12/123"]})

# Build a named regex pattern. 
exp = re.compile(r'(?P<col1>\d+)\/(?P<col2>X)?\/?(?P<col3>\d+)\/(?P<col4>\d+)\/(?P<col5>\d+)')

# Extract parts into columns.
df['s'].str.extract(exp).replace(float('nan'), '')
注:

在本例中使用的正则表达式模式可以被认为是非常自由的,或者过于僵化——这取决于具体的用例。然而,正则表达式的一个很好的特性是,一旦定义了预期的输入文本模式,正则表达式模式就可以很容易地进行更新,以满足需要。因此,编写此特定模式是为了适合问题中的用例。

到目前为止您做了什么?@funie200我尝试了str.split(“/”,expand=T)。但它将字符串按顺序排列。当字符串中没有字符时,我希望第2列为空。“X”总是在第二个位置,还是可以在任何地方?也就是说,是否有可能输入为“1234/123456789/X/12/123”,而您仍然需要Col2中的X?Downvoter,如果我的答案有问题,请让我知道,以便我可以更正它。谢谢。嘿,耶兹雷尔,我投了反对票,因为没有解释密码。这是一段很棒的代码,但我必须自己一行一行地运行它才能理解它。我想一两条解释这种方法的评论会很有帮助。@Alan-好的,给我一点时间。谢谢Jezrael,我投了更高的票。我不知道.shift(),所以我很高兴知道它的存在@MohammadAmir-如果wnat测试大写字母
A,B,X
则将
m=df1['Col2'].ne('X')改为~u numpy()
改为
m=~df1['Col2'].isin(['A','B','X'])。改为~u numpy
    col1    col2         col3   col4    col5
0   1234            123456789     12     123
1   1234       X    123456789     12     123