首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python -用大熊猫从excel中进行数据的匹配和提取

Python -用大熊猫从excel中进行数据的匹配和提取
EN

Stack Overflow用户
提问于 2021-07-30 03:25:55
回答 3查看 989关注 0票数 1

我正在编写一个python脚本,它可以自动为我打一些电话。我有一个测试工具,可以与REST交互。我需要选择一个特定的载体,根据哪个国家的代码被输入。假设我的用户在我的excel文档中输入12145221414,我想选择AT&T作为载体。如何接受表第一列的输入,然后输出第二列中的内容?

显然,这会变得有点棘手,因为我需要匹配电话号码前面的3-4位数字。我的计划是编写一个函数,然后取初始数字,然后插入那个国家需要使用的载体。

知道如何从表中提取这些数据吗?如果你进入巴巴多斯(1246),那么我该怎么做才能选择Lime而不是AT&T?

这是到目前为止我的代码和表。我不知道如何读取一个表,然后从该表中提取数据以用于我的匹配函数。

testlist.xlsx

代码语言:javascript
复制
| Number |
|:------------|
|8155555555|
|12465555555|
|12135555555|
|96655555555|
|525555555555|

carriers.xlsx

代码语言:javascript
复制
| countryCode | Carrier |
|:------------|:--------|
|1246|LIME|
|1|AT&T|
|81|Softbank|
|52|Telmex|
|966|Zain|
代码语言:javascript
复制
import pandas as pd
import os

FILE_PATH = "C:/temp/testlist.xlsx"
xl_1 = pd.ExcelFile(FILE_PATH)
num_df = xl_1.parse('Numbers')

FILE_PATH = "C:/temp/carriers.xlsx"
xl_2 = pd.ExcelFile(FILE_PATH)
car_df = xl_2.parse('Carriers')


for index, row in num_df.iterrows():
EN

回答 3

Stack Overflow用户

发布于 2021-07-30 08:46:35

让我们假设以下输入:

代码语言:javascript
复制
>>> df1
         Number
0    8155555555
1   12465555555
2   12135555555
3   96655555555
4  525555555555

>>> df2
   countryCode   Carrier
0         1246      LIME
1            1      AT&T
2           81  Softbank
3           52    Telmex
4          966      Zain

首先,我们需要重做一点df2,以便按降序对countryCode排序,使其成为字符串,并将其设置为索引。

后面的诀窍是将countryCode 按降序排序。这将确保较长的国家代码(如"1246“)在”1“等较短的国家代码之前匹配。

代码语言:javascript
复制
>>> df2 = df2.sort_values(by='countryCode', ascending=False).astype(str).set_index('countryCode')
>>> df2
              Carrier
countryCode          
1246             LIME
966              Zain
81           Softbank
52             Telmex
1                AT&T

最后,我们使用从国家代码按降序提取最长代码的正则表达式(此处为'1246|966|81|52|1'使用'|'.join(df2.index)),并将其映射到载波:

代码语言:javascript
复制
(df1.astype(str)['Number']
    .str.extract('^(%s)'%'|'.join(df2.index))[0]
    .map(df2['Carrier'])
)

产出:

代码语言:javascript
复制
0    Softbank
1        LIME
2        AT&T
3        Zain
4      Telmex
Name: 0, dtype: object

注意:若要将其添加到初始数据中,请执行以下操作:

代码语言:javascript
复制
df1['carrier'] = (df1.astype(str)['Number']
                     .str.extract('^(%s)'%'|'.join(df2.index))[0]
                     .map(df2['Carrier'])
                 ).to_clipboard(0)

产出:

代码语言:javascript
复制
         Number   carrier
0    8155555555  Softbank
1   12465555555      LIME
2   12135555555      AT&T
3   96655555555      Zain
4  525555555555    Telmex
票数 1
EN

Stack Overflow用户

发布于 2021-07-30 04:18:19

我只能想出一个低效的解决办法。

首先,按国家代码的字母顺序对载体的数据框架进行排序。这样,较长的前缀将更接近开始。

代码语言:javascript
复制
codes = xl_2.sort_values('countryCode', ascending=False)

接下来,定义一个函数,该函数与第二个数据帧中的每个国家代码相匹配,并找到第一个匹配(如果有的话)的索引(请记住,该匹配是最长的)。

代码语言:javascript
复制
def cc2carrier(num):
    matches = codes['countryCode'].apply(lambda x: num.startswith(x))
    if not matches.any(): #Not found
        return np.nan
    return codes.loc[matches.idxmax()]['Carrier']

现在,将该函数应用于numbers dataframe:

代码语言:javascript
复制
xl_1['Number'].apply(cc2carrier)
#1    Softbank
#2        LIME
#3        AT&T
#4        Zain
#5      Telmex
#Name: Number, dtype: object
票数 0
EN

Stack Overflow用户

发布于 2021-07-30 04:19:53

如果我正确地理解了它,您只需要从输入列(Number)中获取第一个字符,然后将其与carriers.xlsx的第二个dataframe匹配。

提取数字列的第一个字符。提示: nbr_of_chars变量应该基于carriers.xlsx中列countryCode的最大字符长度

代码语言:javascript
复制
nbr_of_chars = 4
df.loc[df['Number'].notnull(), 'FirstCharsColumn'] = df['Number'].str[:nbr_of_chars]

然后,使用dataframe联接进行匹配应该是相当容易的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68585101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档