我正在编写一个python脚本,它可以自动为我打一些电话。我有一个测试工具,可以与REST交互。我需要选择一个特定的载体,根据哪个国家的代码被输入。假设我的用户在我的excel文档中输入12145221414,我想选择AT&T作为载体。如何接受表第一列的输入,然后输出第二列中的内容?
显然,这会变得有点棘手,因为我需要匹配电话号码前面的3-4位数字。我的计划是编写一个函数,然后取初始数字,然后插入那个国家需要使用的载体。
知道如何从表中提取这些数据吗?如果你进入巴巴多斯(1246),那么我该怎么做才能选择Lime而不是AT&T?
这是到目前为止我的代码和表。我不知道如何读取一个表,然后从该表中提取数据以用于我的匹配函数。
testlist.xlsx
| Number |
|:------------|
|8155555555|
|12465555555|
|12135555555|
|96655555555|
|525555555555|carriers.xlsx
| countryCode | Carrier |
|:------------|:--------|
|1246|LIME|
|1|AT&T|
|81|Softbank|
|52|Telmex|
|966|Zain|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():发布于 2021-07-30 08:46:35
让我们假设以下输入:
>>> 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“等较短的国家代码之前匹配。
>>> 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)),并将其映射到载波:
(df1.astype(str)['Number']
.str.extract('^(%s)'%'|'.join(df2.index))[0]
.map(df2['Carrier'])
)产出:
0 Softbank
1 LIME
2 AT&T
3 Zain
4 Telmex
Name: 0, dtype: object注意:若要将其添加到初始数据中,请执行以下操作:
df1['carrier'] = (df1.astype(str)['Number']
.str.extract('^(%s)'%'|'.join(df2.index))[0]
.map(df2['Carrier'])
).to_clipboard(0)产出:
Number carrier
0 8155555555 Softbank
1 12465555555 LIME
2 12135555555 AT&T
3 96655555555 Zain
4 525555555555 Telmex发布于 2021-07-30 04:18:19
我只能想出一个低效的解决办法。
首先,按国家代码的字母顺序对载体的数据框架进行排序。这样,较长的前缀将更接近开始。
codes = xl_2.sort_values('countryCode', ascending=False)接下来,定义一个函数,该函数与第二个数据帧中的每个国家代码相匹配,并找到第一个匹配(如果有的话)的索引(请记住,该匹配是最长的)。
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:
xl_1['Number'].apply(cc2carrier)
#1 Softbank
#2 LIME
#3 AT&T
#4 Zain
#5 Telmex
#Name: Number, dtype: object发布于 2021-07-30 04:19:53
如果我正确地理解了它,您只需要从输入列(Number)中获取第一个字符,然后将其与carriers.xlsx的第二个dataframe匹配。
提取数字列的第一个字符。提示: nbr_of_chars变量应该基于carriers.xlsx中列countryCode的最大字符长度
nbr_of_chars = 4
df.loc[df['Number'].notnull(), 'FirstCharsColumn'] = df['Number'].str[:nbr_of_chars]然后,使用dataframe联接进行匹配应该是相当容易的。
https://stackoverflow.com/questions/68585101
复制相似问题