吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2047|回复: 11
收起左侧

[求助] python pandas多条件匹配的问题

[复制链接]
cqwcns 发表于 2021-6-22 18:17
python中有两个df,格式见图。我希望用df1匹配df2。
遍历df1的行,再遍历df2的行。
如果df1的地址同时包含df2的“镇”、“行政村名称”、“自然村名称”,则将df2的3列添加到df1后面。
不知道怎么实现?

[Python] 纯文本查看 复制代码
import pandas as pd

df_1 = pd.read_csv("退单地址表.csv", low_memory=False)
df_2 = pd.read_csv("精简自然村.csv", low_memory=False)

for index, row in df_1.iterrows():
    print(index, row[0], row[1])


微信图片_20210622180406.png

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

729 发表于 2021-6-22 19:00
用and  同时存在 就执行
a='123'
if '1' in a and '2' in a:
    就执行
wk222 发表于 2021-6-22 19:16
用pandas的MASK方法取出判断条件为true索引新建个df1,再把df2里对应索引的行抽出,这俩合并应该就行
 楼主| cqwcns 发表于 2021-6-22 21:04
我现在写成这样,但实在是太慢了,由于实际数据行数多达过万条,每条耗时需要 1-2秒,太慢了。

[Python] 纯文本查看 复制代码
import pandas as pd

df_chargeback = pd.read_csv("t.csv", low_memory=False)
df_village = pd.read_csv("精简自然村.csv", low_memory=False)

df = pd.DataFrame(
    columns=['地址', '退单数', '区县', '镇', '行政村名称', '自然村名称', '自然村全称', '是否村委办公点所在自然村', '区域', '网格', '看管装维', '装维手机号', '是否已覆盖',
             '备注'])

for index, row in df_chargeback.iterrows():
    print(index, row[0])

    for rows in df_village.iterrows():
        if rows[1][1] in row[0] and rows[1][2] in row[0] and rows[1][3] in row[0]:
            df = df.append(
                {'地址': row[0], '退单数': row[1], '区县': rows[1][0], '镇': rows[1][1], '行政村名称': rows[1][2],
                 '自然村名称': rows[1][3],
                 '自然村全称': rows[1][4], '是否村委办公点所在自然村': rows[1][5], '区域': rows[1][6], '网格': rows[1][7],
                 '看管装维': rows[1][8],
                 '装维手机号': rows[1][9], '是否已覆盖': rows[1][10], '备注': rows[1][11]}, ignore_index=True)

print(df)
layuai 发表于 2021-6-22 21:35
这个用子字符串去匹配查询字符串就行吧,三个子字符串都查询有就添加
cszcszv163 发表于 2021-6-22 22:28
不能把数据源贴出来吗?
sword803 发表于 2021-6-22 22:28
用merge应该可以实现
cszcszv163 发表于 2021-6-23 00:00
20210622235746.png

[Python] 纯文本查看 复制代码
import pandas as pd
df1 = pd.read_excel("数据1.xlsx")
df2 = pd.read_excel("数据2.xlsx")
print(df1)
print(df2)


dics = dict()
df1.iloc[:,0].map(lambda x: df2.iloc[:,0:3].apply((lambda y: dics.update({x:list(y)}) if all(z in x for z in y ) else None),axis = 1))
df3 = pd.DataFrame(dics).T.rename(columns={0:"镇",1:"行政村名称",2:"自然村名称"}).reset_index()
df1 = df1.merge(df3,left_on ='地址',right_on ='index').drop('index',axis=1)
print(df1)
cszcszv163 发表于 2021-6-23 00:10
本帖最后由 cszcszv163 于 2021-6-23 00:12 编辑
cszcszv163 发表于 2021-6-23 00:00
[mw_shl_code=python,true]import pandas as pd
df1 = pd.read_excel("数据1.xlsx")
df2 = pd.read_e ...

另外有一点,df1最好处理一下重复项,df1.drop_duplicates(['地址'])
wanwfy 发表于 2021-6-23 16:07
[Python] 纯文本查看 复制代码
import pandas as pd

data = [{'地址': '茂名市电白区电城镇Y881乡道麻茂村委会麻茂村', '退单数': 19}, {'地址': '茂名市电白区电城镇博贺镇Y881乡道博贺村委会旧村村', '退单数': 12}]
data2 = [{'镇':'博贺','行政村名称':'博贺','自然村名称':'麻茂村'},{'镇':'博贺','行政村名称':'博贺','自然村名称':'旧村'}]

df1 = pd.DataFrame(data)
df2 = pd.DataFrame(data2)

df1.loc[:,'自然村名称'] = df1.loc[:,'地址'].str.extract('村委会(.*村)')[0]

df1.replace('村村','村',regex=True, inplace=True)

pd.merge(df1,df2,on='自然村名称')
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-26 00:32

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表