我确实有一个问题希望—我确信你能帮我.假设我确实有两个框架,每个框架都有多列,但为了简单起见,让我们关注每帧一列. Important:Both frame are different in size, with A being shorter

import pandas as pd

FrameA=pd.DataFrame({"A":["00281378554", "10862520000","82540193700","76015394900","00134355050","21864009"]})

FrameB=pd.DataFrame({"A":["AT511634000134355050","AT411513000281378554", "AT711509100151013992",
"AT511509000121340020","AT424480010862520000","AT742011182540193700","AT531200076015394900","HU02142201082186400900000000"
]})

我的目标如下:我想判断帧A中列A的每个元素,如果从帧B中列A中的it is contained,如果是,那么我想在帧A中创建一个新列(较短的维度),结果如下:

Frame A
Col A            Col B
00281378554      AT411513000281378554
10862520000      AT424480010862520000
82540193700      AT742011182540193700
76015394900      AT531200076015394900
00134355050      AT511634000134355050
21864009         HU02142201082186400900000000 

因此,frameA的新列B将包含frameB中的元素,该元素包含来自frameB的字符串, 我try 了np.where,但由于frameA的尺寸比frameB短,所以它不工作.所以我能做的就是使用for循环.但这是非常耗时的,我认为必须有一个更优雅的解决方案

有什么建议吗?

推荐答案

如果Frame A中的子字符串总是匹配Frame B中的最后11个字符,则slice和map:

FrameA['B'] = FrameA['A'].map(FrameB.set_index(FrameB['A'].str[-11:])['A'])

merge:

out = FrameA.merge(FrameB.rename(columns={'A': 'B'}),
                   left_on='A', right_on=FrameB['A'].str[-11:], how='left')

输出:

             A                     B
0  00281378554  AT411513000281378554
1  10862520000  AT424480010862520000
2  82540193700  AT742011182540193700
3  76015394900  AT531200076015394900
4  00134355050                   NaN

如果子字符串不是固定的,则可以使用相同的方法组成相同长度的组.您还可以确保Frame B不包含重复的值

def make_mapper(length):
    idx = FrameB['A'].str[-length:]
    return (FrameB.set_index(idx)['A']
            .groupby(level=0).first()
           )

FrameA['B'] = (FrameA.groupby(FrameA['A'].str.len(), group_keys=False)['A']
                     .apply(lambda g: g.map(make_mapper(g.name)))
              )

输出:

             A                     B
0  00281378554  AT411513000281378554
1  10862520000  AT424480010862520000
2  82540193700  AT742011182540193700
3  76015394900  AT531200076015394900
4  00134355050                   NaN

在第一个(有效的)映射步骤之后,你可以使用第二个效率较低的逻辑来填充映射其他值,在任何地方都基于子字符串:

def find_anywhere(substr):
    return next((s for s in FrameB['A'] if substr in s), None)

m = FrameA['B'].isna()
FrameA.loc[m, 'B'] = FrameA.loc[m, 'A'].map(find_anywhere)

最终输出:

             A                             B
0  00281378554          AT411513000281378554
1  10862520000          AT424480010862520000
2  82540193700          AT742011182540193700
3  76015394900          AT531200076015394900
4  00134355050          AT511634000134355050
5     21864009  HU02142201082186400900000000

Python相关问答推荐

当密钥是复合且唯一时,Pandas合并抱怨标签不唯一

如何才能知道Python中2列表中的巧合.顺序很重要,但当1个失败时,其余的不应该失败或是0巧合

时间序列分解

如何在Windows上用Python提取名称中带有逗号的文件?

按列分区,按另一列排序

Python,Fitting into a System of Equations

在Python argparse包中添加formatter_class MetavarTypeHelpFormatter时, - help不再工作""""

NumPy中条件嵌套for循环的向量化

为什么常规操作不以其就地对应操作为基础?

为什么在FastAPI中创建与数据库的连接时需要使用生成器?

提高算法效率的策略?

如果包含特定值,则筛选Groupby

如何强制向量中的特定元素在Gekko中处于优化解决方案中

如何使用matplotlib查看并列直方图

当我定义一个继承的类时,我可以避免使用`metaclass=`吗?

如何根据一定条件生成段id

有没有一种方法可以在朗肯代理中集成向量嵌入

如何将一个文件的多列导入到Python中的同一数组中?

将参数从另一个python脚本中传递给main(argv

为什么在安装了64位Python的64位Windows 10上以32位运行?