我正在尝试删除包含已完成的调查链接的单元格。
信息表是这样的:
人 | 身份证 | 网络名称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 |
代码
步骤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)