数据框中的pandas-if条件用于获取列名

rn0zuynd  于 2022-12-16  发布在  其他
关注(0)|答案(4)|浏览(133)

我的代码有问题,我试着自己解决,但花了很多时间,还是失败了。
我有两个像这样的数据框。
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条件的错误。

fhity93d

fhity93d1#

df = df_chk.fillna('N/N').applymap(lambda x: x.split('/')[1])
s = df.iloc[:, 2:].eq(df['subgroup_doc'], axis=0).apply(lambda x: x.idxmax(), axis=1)
df_doc.assign(doc_group=s)

N/N只是一个示例,与现有示例不重叠
df_doc.assign(doc_group=s)

doc_id  subgroup_doc    doc_group
0   12345   A01B13/42       sg_2
1   67891   B01C10/257      sg_3
2   23456   C02D7/18        sg_2
bn31dyow

bn31dyow2#

您可以用途:

dfx = df_doc.merge(df_check,on='subgroup_doc')
dfx['key_1'] = dfx['subgroup_doc'].str.split('/').str[1]
'''
    key_1
0   42
1   257
2   18

'''

对于每一行,我们拆分值 如果**/**后面的值与key_1的值匹配,则使用split返回名为cols的列表中的列。

cols = ['main','sg_1','sg_2','sg_3','sg_4']
dfx['check'] = dfx.apply(lambda x: [i if pd.notna(x[i]) and x['key_1'] == x[i].split('/')[1] else False for i in cols],axis=1)
'''
|    |   doc_id | subgroup_doc   | main   | sg_1   | sg_2   | sg_3   |   sg_4 |   key_1 | check                                |
|---:|---------:|:---------------|:-------|:-------|:-------|:-------|-------:|--------:|:-------------------------------------|
|  0 |    12345 | A01B13/42      | 13/00  | 13/04  | 13/42  | nan    |    nan |      42 | [False, False, 'sg_2', False, False] |
|  1 |    67891 | B01C10/257     | 10/00  | 10/02  | 10/25  | 10/257 |    nan |     257 | [False, False, False, 'sg_3', False] |
|  2 |    23456 | C02D7/18       | 7/00   | 7/01   | 7/18   | nan    |    nan |      18 | [False, False, 'sg_2', False, False] |
'''

让我们抛开虚假因素:

dfx['check'] = dfx['check'].apply(lambda x: [i for i in x if i]).explode()

输出:

dfx=dfx[['doc_id','subgroup_doc','check']]

|    |   doc_id | subgroup_doc   | check   |
|---:|---------:|:---------------|:--------|
|  0 |    12345 | A01B13/42      | sg_2    |
|  1 |    67891 | B01C10/257     | sg_3    |
|  2 |    23456 | C02D7/18       | sg_2    |
46qrfjad

46qrfjad3#

df_doc和df_check的组合如何产生您想要的结果还不是很清楚。
但也许你想要这样的东西?

In [65]: df_doc.merge(df_check, on="subgroup_doc")
Out[65]:
   doc_id subgroup_doc   main   sg_1   sg_2    sg_3  sg_4
0   12345    A01B13/42  13/00  13/04  13/42     NaN   NaN
1   67891   B01C10/257  10/00  10/02  10/25  10/257   NaN
2   23456     C02D7/18   7/00   7/01   7/18     NaN   NaN
5hcedyr0

5hcedyr04#

你想得到df_check中有条目的列名吗?仍然不确定你的目标是什么。但是我猜这里有你想要的东西。

In [77]: df_doc.merge(df_check, on="subgroup_doc").set_index(["doc_id", "subgro
    ...: up_doc"]).stack().reset_index().drop(0,axis=1)
Out[77]:
   doc_id subgroup_doc level_2
0   12345    A01B13/42    main
1   12345    A01B13/42    sg_1
2   12345    A01B13/42    sg_2
3   67891   B01C10/257    main
4   67891   B01C10/257    sg_1
5   67891   B01C10/257    sg_2
6   67891   B01C10/257    sg_3
7   23456     C02D7/18    main
8   23456     C02D7/18    sg_1
9   23456     C02D7/18    sg_2

相关问题