Python 如何将pandas数据框中的字符串设置在所有行的相同位置?
我正在尝试拆分字符串,以便使用pandas创建CPC层次结构。这是我的数据框Python 如何将pandas数据框中的字符串设置在所有行的相同位置?,python,pandas,Python,Pandas,我正在尝试拆分字符串,以便使用pandas创建CPC层次结构。这是我的数据框df\u all\u new\u p CPC 0 Y10T403/4602 1 H02S20/00 2 H01L31/02168 我正在考虑制作6-10级CPC,条件是1级包含一个字母,2级包含两个字母,3级包含2-3个字母,4、5、6、7、8级。。字母在“/”后面吗
df\u all\u new\u p
CPC
0 Y10T403/4602
1 H02S20/00
2 H01L31/02168
我正在考虑制作6-10级CPC,条件是1级包含一个字母,2级包含两个字母,3级包含2-3个字母,4、5、6、7、8级。。字母在“/”后面吗
比如说
Y10T403/4602 -> Y, 10, T, 403, 43/4, 43/46, 43/460, 43/4602
H02S20/00 -> H, 02, S, 20, 20/0, 20/00
H01L31/02168-> H, 01, L, 31, 31/0, 31/02, 31/021, 31/0216, 31/02168
但是当我运行我的代码时
if df_all_new_p['CPC'].map(lambda x: x[0:7]).str.contains('/').any():
df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:6])
df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[4:8])
df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[4:9])
elif df_all_new_p['CPC'].map(lambda x: x[0:8]).str.contains('/').any():
df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:7])
df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[7:9])
df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[7:10])
else:
df_all_new_p['Lv1'] = df_all_new_p['CPC'].map(lambda x: x[0:1])
df_all_new_p['Lv2'] = df_all_new_p['CPC'].map(lambda x: x[1:3])
df_all_new_p['Lv3'] = df_all_new_p['CPC'].map(lambda x: x[3:4])
df_all_new_p['Lv4'] = df_all_new_p['CPC'].map(lambda x: x[4:8])
df_all_new_p['Lv5'] = df_all_new_p['CPC'].map(lambda x: x[8:10])
df_all_new_p['Lv6'] = df_all_new_p['CPC'].map(lambda x: x[8:11])
df_all_new_p
CPC Lv1 Lv2 Lv3 Lv4 Lv5 Lv6
0 Y10T403/4602 Y1 0 T4 03 4602
1 H02S20/00 H 02 S 20 20/0 20/00
2 H01L31/02168 H0 1 L3 1/ 02168
结果表明,只有1h02s20/00
得到了正确的答案,其他行得到了错误的结果。我认为原因在于每行中的字符位置。因此,我不知道有没有办法解决这个问题
我希望看到这样的结果
CPC 1 2 3 4 5 6
Y10T403/4602 Y 10 T 403 43/4 43/46
H02S20/00 H 02 S 20 20/0 20/00
H01L31/02168 H 01 L 31 31/0 31/02
在前言中说,可能有更有效的方法来做到这一点。也就是说,您可以使用str.find(“/”)帮助建立索引:
df=pd.DataFrame({'a':[1,2,3],'CPC':['Y10T403/4602','H02S20/00','H01L31/02168']})
a CPC
0 1 Y10T403/4602
1 2 H02S20/00
2 3 H01L31/02168
[i[i.find('/')-2:i.find('/')+3] for i in df['CPC']]
['03/46', '20/00', '31/02']
因此,您可以定义一个传递给df.apply()的函数
并应用它,然后将列拆分为多个列(*-编辑以删除不必要的lambda)
然后放下过渡柱
df.drop('p', axis=1, inplace=True)
a CPC 1 2 3 4 5 6
0 1 Y10T403/4602 Y 10 T 403 03/4 03/46
1 2 H02S20/00 H 02 S 20 20/0 20/00
2 3 H01L31/02168 H 01 L 31 31/0 31/02
在前言中说,可能有更有效的方法来做到这一点。也就是说,您可以使用str.find(“/”)帮助建立索引:
df=pd.DataFrame({'a':[1,2,3],'CPC':['Y10T403/4602','H02S20/00','H01L31/02168']})
a CPC
0 1 Y10T403/4602
1 2 H02S20/00
2 3 H01L31/02168
[i[i.find('/')-2:i.find('/')+3] for i in df['CPC']]
['03/46', '20/00', '31/02']
因此,您可以定义一个传递给df.apply()的函数
并应用它,然后将列拆分为多个列(*-编辑以删除不必要的lambda)
然后放下过渡柱
df.drop('p', axis=1, inplace=True)
a CPC 1 2 3 4 5 6
0 1 Y10T403/4602 Y 10 T 403 03/4 03/46
1 2 H02S20/00 H 02 S 20 20/0 20/00
2 3 H01L31/02168 H 01 L 31 31/0 31/02
下面是另一种可能的方法,在自定义函数中使用regex
模式和Series.extract
和pandas.concat
:
def cpc_hierarchy(cpc_series):
pat1 = '(.)(\d{2})(.)(\d{2,3})'
pat2 = '(\d{2}\/\d{1})'
pat3 = '(\d{2}\/\d{2})'
expanded = (pd.concat([
cpc_series.to_frame(),
cpc_series.str.extract(pat1),
cpc_series.str.extract(pat2),
cpc_series.str.extract(pat3)],
ignore_index=True,
axis=1).set_index(0).rename_axis('CPC', 0))
return expanded
print(cpc_hierarchy(df['CPC']))
1 2 3 4 5 6
CPC
Y10T403/4602 Y 10 T 403 03/4 03/46
H02S20/00 H 02 S 20 20/0 20/00
H01L31/02168 H 01 L 31 31/0 31/02
下面是另一种可能的方法,在自定义函数中使用regex
模式和Series.extract
和pandas.concat
:
def cpc_hierarchy(cpc_series):
pat1 = '(.)(\d{2})(.)(\d{2,3})'
pat2 = '(\d{2}\/\d{1})'
pat3 = '(\d{2}\/\d{2})'
expanded = (pd.concat([
cpc_series.to_frame(),
cpc_series.str.extract(pat1),
cpc_series.str.extract(pat2),
cpc_series.str.extract(pat3)],
ignore_index=True,
axis=1).set_index(0).rename_axis('CPC', 0))
return expanded
print(cpc_hierarchy(df['CPC']))
1 2 3 4 5 6
CPC
Y10T403/4602 Y 10 T 403 03/4 03/46
H02S20/00 H 02 S 20 20/0 20/00
H01L31/02168 H 01 L 31 31/0 31/02
apply(lambda x:parse\u cpc(x))
可以是apply(parse\u cpc)
。。。这里不需要lambdaapply(lambda x:parse\u cpc(x))
可以是apply(parse\u cpc)
。。。这里不需要lambda