拆分并从列值中取出一部分字符串,然后在pandas python中创建新列
问题描述:
我有一个字符串,类似于我的df中的一列值。拆分并从列值中取出一部分字符串,然后在pandas python中创建新列
ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232
ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232
如何获取此列的一部分的新列。我需要的部分是
74
89
答
string.split()
允许您根据隔板(这里/
和-
)爆炸字符串转换部分的列表。
s = 'ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232'
print s.split('/')[2].split('-')[1]
# 74
使用pandas.apply()
将它应用到你的专栏
df['b'] = df['a'].apply(lambda s:s.split('/')[2].split('-')[1])
print (df)
输出
a b
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232 74
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232 89
注:使用@A-Za-z的解决方案,它比我更快。
答
假设你的数据框被称为DF和你列col:
df['sub_col'] = pd.Series([s[21:23] for s in df['col'].values], index=df.index)
答
如果是DF
val
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232
您可以使用str.extract
df['num_val'] = df.val.str.extract('LNFFF-(\d+)/', expand = False)
你得到
val num_val
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232 74
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232 89
答
看来你需要str.extract
:用分裂
df = pd.DataFrame({'a': ['ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232',
'ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232']})
print (df)
a
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232
df['new'] = df['a'].str.extract('LNFFF-(\d+)', expand=False)
#if necessary convert to ints
df['new'] = df['new'].astype(int)
print (df)
a new
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232 74
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232 89
解决方案通过split
并选择由indexing with str:
df['new'] = df['a'].str.split('/').str[2].str.extract('(\d+)', expand=False)
print (df)
a new
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232 74
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232 89
df['new'] = df['a'].str.split('/').str[2].str.split('-').str[1]
print (df)
a new
0 ttt-OPP/MKKL-7/LNFFF-74/OOOP-71/AAD-1/RRR-232 74
1 ttt-OPP/MKKL-7/LNFFF-89/OOOP-71/AAD-1/RRR-232 89
尼斯之一。问题:如果我还需要应用一个条件会怎么样?即:如果's'包含字符串'OPP',则只填写'df ['b']' –