cqwcns 发表于 2021-6-22 18:17

python pandas多条件匹配的问题

python中有两个df,格式见图。我希望用df1匹配df2。
遍历df1的行,再遍历df2的行。
如果df1的地址同时包含df2的“镇”、“行政村名称”、“自然村名称”,则将df2的3列添加到df1后面。
不知道怎么实现?

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, row)

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秒,太慢了。

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)

    for rows in df_village.iterrows():
      if rows in row and rows in row and rows in row:
            df = df.append(
                {'地址': row, '退单数': row, '区县': rows, '镇': rows, '行政村名称': rows,
               '自然村名称': rows,
               '自然村全称': rows, '是否村委办公点所在自然村': rows, '区域': rows, '网格': rows,
               '看管装维': rows,
               '装维手机号': rows, '是否已覆盖': rows, '备注': rows}, 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



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
import pandas as pd
df1 = pd.read_excel("数据1.xlsx")
df2 = pd.read_e ...
另外有一点,df1最好处理一下重复项,df1.drop_duplicates(['地址'])

wanwfy 发表于 2021-6-23 16:07


import pandas as pd

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

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

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

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

pd.merge(df1,df2,on='自然村名称')
页: [1] 2
查看完整版本: python pandas多条件匹配的问题