如何删除 pandas 数据框中与另一个数据框的列中的值匹配的单个单元格?

问题描述 投票:0回答:1

我正在尝试删除包含已完成的调查链接的单元格。

信息表是这样的:

身份证 网络名称1 webURL1 网络名称2 webURL2 网络名称3 webURL3
A x htp://aa-x o htp://aa-o p ht p://aa-p
B bb n htp://aa-n x htp://aa-x

不会有重复的网页链接,不同的人有不同的链接数量

结果表包含链接:

答案1 答案2 链接
asd asd htp://aa-x
sdf sdf ht p://bb-x

我想将结果表与信息表相匹配,并删除结果表中信息表的网址名称和网址,如果我迭代所有单元格,请给我一些简单方法的建议在数据框中,这会太耗时。

我希望最终的外观是:

信息表:

身份证 网络名称1 webURL1 网络名称2 webURL2 网络名称3 webURL3
A o htp://aa-o p ht p://aa-p
B bb n htp://aa-n
python pandas dataframe multiple-columns
1个回答
0
投票

代码

步骤1。将宽变长并删除具有 df1 内容的行

tmp = pd.wide_to_long(df, stubnames=['webName', 'webURL'], i=['Person', 'ID'], j='val')\
        .reset_index().drop('val', axis=1)\
        .mask(lambda x: x['webURL'].isin(df1['link'])).dropna()

tmp:

    Person  ID  webName webURL
1   A       aa  o       ht\tp://aa-o
2   A       aa  p       ht\tp://aa-p
3   B       bb  n       ht\tp://aa-n

步骤2。变长变宽

grp = tmp.groupby(['Person', 'ID']).cumcount().add(1).astype('str')
tmp1 = tmp.assign(grp=grp).pivot(index=['Person', 'ID'], columns='grp', values=['webName', 'webURL'])\
          .sort_index(level=1, axis=1)
tmp1.set_axis(tmp1.columns.map(lambda x: ''.join(x)), axis=1).reset_index()

输出:

Person  ID  webName1    webURL1         webName2    webURL2
0   A   aa  o           ht\tp://aa-o    p           ht\tp://aa-p
1   B   bb  n           ht\tp://aa-n    NaN         NaN

示例代码

import pandas as pd
data1 = {'Person': ['A', 'B'], 'ID': ['aa', 'bb'], 'webName1': ['x', 'n'], 'webURL1': ['ht\\tp://aa-x', 'ht\\tp://aa-n'], 
         'webName2': ['o', 'x'], 'webURL2': ['ht\\tp://aa-o', 'ht\\tp://aa-x'], 
         'webName3': ['p', None], 'webURL3': ['ht\\tp://aa-p', None]}
data2 = {'answer1': ['asd', 'sdf'], 'answer2': ['asd', 'sdf'], 
         'link': ['ht\\tp://aa-x', 'ht\\tp://bb-x']}

df = pd.DataFrame(data1)
df1 = pd.DataFrame(data2)
© www.soinside.com 2019 - 2024. All rights reserved.