python - 如何将熊猫数据框中的字符串设置在所有行的相同位置?
问题描述
我正在尝试拆分字符串以使用熊猫创建 CPC 层次结构。这是我的数据框df_all_new_p
CPC
0 Y10T403/4602
1 H02S20/00
2 H01L31/02168
我正在考虑制作6-10级CPC,条件是Lv.1包含一个字母,Lv2包含两个字母,Lv3包含2-3个字母,Lv4,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
结果表明,只有1 H02S20/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()
def parse_cpc(val):
elems=[]
elems.append(val[0])
elems.append(val[1:3])
elems.append(val[3])
elems.append(val[4:val.find('/')])
elems.append(val[val.find('/')-2:val.find('/')+2])
elems.append(val[val.find('/')-2:val.find('/')+3])
return elems
并应用它,然后将列拆分为多列(*-编辑以删除不必要的 lambda)
df['p']=df['CPC'].apply(parse_cpc)*
a CPC p
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]
df[[1,2,3,4,5,6]]=pd.DataFrame(df['p'].values.tolist())
a CPC p 1 2 3 4 5 6
0 1 Y10T403/4602 [Y, 10, T, 403, 03/4, 03/46] Y 10 T 403 03/4 03/46
1 2 H02S20/00 [H, 02, S, 20, 20/0, 20/00] H 02 S 20 20/0 20/00
2 3 H01L31/02168 [H, 01, L, 31, 31/0, 31/02] H 01 L 31 31/0 31/02
然后删除过渡列
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
推荐阅读
- javascript - MongoDB 从正文中查找、更新和验证空字段
- c# - 使用 Left Dock 时出现 AutoScroll 问题 - C# Telerik Winforms
- javascript - 如何在 Laravel Mix 中为每个文件使用不同的编译设置来编译多个 JavaScript 文件
- elasticsearch - Elasticsearch 上的结果可疑的低
- excel - 对于列中的每个 xxx 未按预期工作
- opentok - OpenTok / ToxBox:将 API 密钥保密?
- html - Flexbox 容器的粘性位置
- php - 如何返回数组的文本值而不是函数结果?
- angular - 路由器出口刷新整个站点
- javascript - 从 Chrome 扩展,如何防止 Chrome 也自动从响应的 rel=preload 链接响应标头请求资源?