pandas-if条件在数据帧中获取列名



我的代码有一个问题,并试图自己解决它,但它已经花费了很多时间,仍然失败。

我有两个这样的数据帧。

df_doc

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-condition写错。

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

您可以使用:

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
'''

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

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    |

不太清楚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

您想获得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

最新更新