我的代码有问题,我试着自己解决,但花了很多时间,还是失败了。
我有两个像这样的数据框。
df_文档
doc_id subgroup_doc
12345 A01B13/42
67891 B01C10/257
23456 C02D7/18
和df_check
subgroup_doc main sg_1 sg_2 sg_3 sg_4
A01B13/42 13/00 13/04 13/42 NaN NaN
B01C10/257 10/00 10/02 10/25 10/257 NaN
C02D7/18 7/00 7/01 7/18 NaN NaN
我就是想得到这样的结果
doc_id subgroup_doc doc_group
12345 A01B13/42 sg_2
67891 B01C10/257 sg_3
23456 C02D7/18 sg_2
然后我创建了一个函数
def checkdot_ipc_sg2_v2(raw_data,check_group):
new_raw_data = raw_data[['doc_id','subgroup_doc']]
merge_find_group = pd.merge(new_raw_data, check_group, how='left', on=['subgroup_doc'])
t_doc = merge_find_group.subgroup_doc.str.split('/')
s_doc_sg2 = merge_find_group.sg_2.str.split('/')
s_doc_sg1 = merge_find_group.sg_1.str.split('/')
s_doc_sg0 = merge_find_group.maingroup.str.split('/')
raw_data['doc_checkgp'] = t_doc.str[0]+ "/" + s_doc_sg2.str[1].str[:]
raw_data['doc_group'] = 'sg_2'
if(raw_data['doc_checkgp'].isna().any()):
raw_data['doc_checkgp'].fillna(t_doc.str[0]+ "/" + s_doc_sg1.str[1].str[:], inplace=True)
raw_data['doc_group'] = 'sg_1'
if(raw_data['doc_checkgp'].isna().any()):
raw_data['doc_checkgp'].fillna(t_doc.str[0]+ "/" + s_doc_sg0.str[1].str[:], inplace=True)
raw_data['doc_group'] = 'sg_0'
但结果返回为
doc_id subgroup_doc doc_checkgp doc_group
12345 A01B13/42 A01B13/42 sg_0
67891 B01C10/257 B01C10/257 sg_0
23456 C02D7/18 C02D7/18 sg_0
我写错了什么吗?我想我没有犯任何if条件的错误。
4条答案
按热度按时间fhity93d1#
N/N只是一个示例,与现有示例不重叠
df_doc.assign(doc_group=s)
:bn31dyow2#
您可以用途:
对于每一行,我们拆分值 如果**/**后面的值与key_1的值匹配,则使用split返回名为cols的列表中的列。
让我们抛开虚假因素:
输出::
46qrfjad3#
df_doc和df_check的组合如何产生您想要的结果还不是很清楚。
但也许你想要这样的东西?
5hcedyr04#
你想得到df_check中有条目的列名吗?仍然不确定你的目标是什么。但是我猜这里有你想要的东西。