python - 基于来自另一个数据框 pandas 的匹配值的新列
问题描述
如果我们有两个数据帧,例如df1
和df2
在下面显示的示例中;我们如何合并它们来生成df3
?
import pandas as pd
import numpy as np
data1 = [("a1",["A","B"]),("a2",["A","B","C"]),("a3",["B","C"])]
df1 = pd.DataFrame(data1,columns = ["column1","column2"])
print df1
data2 = [("A",["1","2"]),("B",["1","3","4"]),("C",["5"])]
df2 = pd.DataFrame(data2,columns=["column3","column4"])
print df2
data3 = [("a1",["A","B"],["1","2","3","4"]),("a2",["A","B","C"],
["1","2","3","4","5"]),("a3",["B","C"],["1","3","4","5"])]
df3 = pd.DataFrame(data3,columns = ["column1","column2","column5"])
print df3
我的目标是不使用 for 循环,因为我正在处理大型数据集
解决方案
stack
重新创建后检查df1 的列表列,DataFrame
然后map
使用来自的值df2
另外,由于您要求不使用我正在使用的 for 循环sum
,并且sum
对于这种情况,它比*for loop*
or慢得多itertools
s=pd.DataFrame(df1.column2.tolist()).stack()
df1['New']=s.map(df2.set_index('column3').column4).sum(level=0).apply(set)
df1
Out[36]:
column1 column2 New
0 a1 [A, B] {2, 4, 3, 1}
1 a2 [A, B, C] {3, 5, 4, 2, 1}
2 a3 [B, C] {4, 3, 1, 5}
正如我提到的和我们大多数人所建议的那样,您也可以检查带有熊猫的 For 循环 - 我什么时候应该关心?
import itertools
d=dict(zip(df2.column3,df2.column4))
l=[set(itertools.chain(*[d[y] for y in x ])) for x in df1.column2.tolist()]
df1['New']=l
推荐阅读
- javascript - 如何对数组进行分组并获取具有相似类型/组织的所有记录的计数
- python - Tensorflow Keras TypeError:“NoneType”类型的对象没有len()
- azure-devops - 如何在 YAML 中使用 VSTS 管道变量?
- css - 我的 CSS 形状的圆角问题
- visual-studio-code - vscode:如何在片段*未*选择后制作文本?
- python - 用相应bin的平均值替换列中的数据?
- wordpress - 如何从wordpress中的类别url中删除类别词
- winforms - 如果用户通过关闭终端(Winforms)关闭应用程序,如何捕获关闭事件?
- python - 在 Python 中使用 api 请求时迭代 xml 正文中的页面
- reactjs - 盖茨比仅在刷新时出现