Python 查找数据帧中某行的子集值

Python 查找数据帧中某行的子集值,python,pandas,Python,Pandas,这是我其他问题之一的后续解决方案/问题: 我们有两个数据帧: df1 = pd.DataFrame({"TEL": ["49123410", "49123411","49123412","49123413","49123414","49123710", "49123810"]}) df2 = pd.DataFrame({"BASE_NR": ["491234","491237","491238"],"NAME": ["A","B","C"]}) 我要做的是将一个df2名称分配给df1 TEL。

这是我其他问题之一的后续解决方案/问题:

我们有两个数据帧:

df1 = pd.DataFrame({"TEL": ["49123410", "49123411","49123412","49123413","49123414","49123710", "49123810"]})
df2 = pd.DataFrame({"BASE_NR": ["491234","491237","491238"],"NAME": ["A","B","C"]})
我要做的是将一个df2名称分配给df1 TEL。如果我们取第一个值“491234”,我们会看到df1中的前五个列表条目正好从这个字符串开始。这将导致如下结果:

|   | TEL      | PREFIX |
| 0 | 49123410 | 491234 |
| 1 | 49123411 | 491234 |
| 2 | 49123412 | 491234 |
| 3 | 49123413 | 491234 |
| 4 | 49123414 | 491234 |
| 5 | 49123710 | 491237 |
| 6 | 49123810 | 491238 |
不在

我开发了另一种工作速度更快的方法:

for i, s in df2.iterrows():
    df1.loc[df1["TEL"].str.startswith(s[0], na=False), "PREFIX"] = s[0]
到目前为止,它工作得很好,我一直在反复使用它,因为我必须匹配许多不同来源的电话号码及其子集。但是最近,我遇到了越来越多的问题。前缀列将被设置,但保持为空。再也找不到匹配项了,我以前有大约150000个匹配项

是否有一些基本的东西我错过了,这是唯一的运气,它这样工作?输入文件(我从csv读取它们)和数据类型没有更改。我也没有改变熊猫的版本(22)

PS:还有一个想法也会很有帮助,那就是如何调试这里发生的部分:

df1.loc[df1["TEL"].str.startswith(s[0], na=False), "PREFIX"] = s[0]

如果你追求的是速度,这应该更快:

mapping = dict(zip(df2['BASE_NR'].tolist(), df2['NAME'].tolist()))

def getName(tel):
    for k, v in mapping.items():
        if tel.startswith(k):
            return k, v
    return '', ''

df1['BASE_NR'], df1['NAME'] = zip(*df1['TEL'].apply(getName))

您的代码使用您提供的数据。你能给我们一些数据来证明你的逻辑在哪里失败吗?换句话说,a?或者为什么不使用
df1.TEL.str[:-2]
?因为长度不同。这只是一个非常简单的例子。嗨,Zipa,你的解决方案“有点”超出了我目前的Python知识。你能解释一下为什么它更好吗?我想我理解的是,你创建了一个dict,这通常是一个更快的方法,因为所有的东西都被加载到内存中?我走对了吗?除此之外,我的问题不仅仅是速度。但我有一种奇怪的行为,我在寻找解释。我现在已经自己弄明白了。这是一个“简单”的打字错误。我希望很快能找到时间来尝试您的解决方案。@SLglider这是一种自定义连接,其中您有一个指向各自名称的dict
BASE\n
。假设
BASE\u NR
不完全匹配
TEL
此代码通过dict执行,如果
TEL
以key(
BASE\u NR
)开头,它会立即返回其密钥/值对。如果未找到匹配项,则返回两个的空字符串。希望您会发现这一点很有帮助:)