- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有 2 个大数据集(每个大 70K 到 110K)。我想关联/比较两者,并根据某些条件/标准查找 set2 中的哪些项目可以在 set1 中找到。
我目前的策略是按公共(public)字段对两个列表进行排序,然后运行嵌套 for
循环,执行条件 if
测试,将预定义字典与找到的项目和不匹配的项目聚合。
例子:
import pandas as pd
list1 = [{'a': 56, 'b': '38', 'c': '11', 'd': '10', 'e': 65},
{'a': 31, 'b': '12', 'c': '26', 'd': '99', 'e': 71},
{'a': 70, 'b': '49', 'c': '40', 'd': '227', 'e': 1},
{'a': 3, 'b': '85', 'c': '32', 'd': '46', 'e': 70},]
list2 = [{'a': 56, 'b': '38', 'c': '11', 'd': '10', 'e': 65},
{'a': 145, 'b': '108', 'c': '123', 'd': '84', 'e': 3},
{'a': 113, 'b': '144', 'c': '183', 'd': '7', 'e': 12},
{'a': 144, 'b': '60', 'c': '46', 'd': '106', 'e': 148},
{'a': 57, 'b': '87', 'c': '51', 'd': '95', 'e': 187},
{'a': 41, 'b': '12', 'c': '26', 'd': '99', 'e': 71},
{'a': 80, 'b': '49', 'c': '40', 'd': '227', 'e': 1},
{'a': 3, 'b': '85', 'c': '32', 'd': '46', 'e': 70},
{'a': 107, 'b': '95', 'c': '81', 'd': '15', 'e': 25},
{'a': 138, 'b': '97', 'c': '38', 'd': '28', 'e': 171}]
re_dict = dict([('found', []), ('alien', [])])
for L2 in list2:
for L1 in list1:
if (L1['a']-5 <= L2['a'] <= L2['a']+10) and L2['c'][-1:] in L1['c'][-1:]:
if (65 <= L2['e'] <= 75):
L2.update({'e': 'some value'})
re_dict['found'].append(L2)
list1.remove(L1)
break # break out from the inner loop
else: # if the inner loop traversed entire list, there were no matches
re_dict['alien'].append(L2)
以上产生了预期的结果:
re_dict
{'alien': [{'a': 145, 'b': '108', 'c': '123', 'd': '84', 'e': 3},
{'a': 113, 'b': '144', 'c': '183', 'd': '7', 'e': 12},
{'a': 57, 'b': '87', 'c': '51', 'd': '95', 'e': 187},
{'a': 41, 'b': '12', 'c': '26', 'd': '99', 'e': 71},
{'a': 107, 'b': '95', 'c': '81', 'd': '15', 'e': 25},
{'a': 138, 'b': '97', 'c': '38', 'd': '28', 'e': 171}],
'found': [{'a': 56, 'b': '38', 'c': '11', 'd': '10', 'e': 'some value'},
{'a': 144, 'b': '60', 'c': '46', 'd': '106', 'e': 148},
{'a': 80, 'b': '49', 'c': '40', 'd': '227', 'e': 1},
{'a': 3, 'b': '85', 'c': '32', 'd': '46', 'e': 'some value'}]}
所以它完成了工作,但显然效率不高,似乎是 pandas
的理想工作.
我认为如果我可以合并/加入两个 DataFrames
会很理想,但我无法弄清楚如何合并复杂的标准。我的数据集大小也不相等。
例子:
df1 = pd.DataFrame(list1)
df2 = pd.DataFrame(list2)
pd.merge(df1,df2,on='d',how='outer')
a_x b_x c_x d e_x a_y b_y c_y e_y
0 56 38 11 10 65 56 38 11 65
1 31 12 26 99 71 41 12 26 71
2 70 49 40 227 1 80 49 40 1
3 3 85 32 46 70 3 85 32 70
4 NaN NaN NaN 84 NaN 145 108 123 3
5 NaN NaN NaN 7 NaN 113 144 183 12
6 NaN NaN NaN 106 NaN 144 60 46 148
7 NaN NaN NaN 95 NaN 57 87 51 187
8 NaN NaN NaN 15 NaN 107 95 81 25
9 NaN NaN NaN 28 NaN 138 97 38 171
只有当 d 列在 df1
中完全相等时才会合并和 df2
.我更喜欢能够定义一个范围,即如果 df2['d']-5 <= df1['d'] <= df2['d']+5
它仍然没问题,这意味着两个数据框中的这些行都是要合并的候选者,只有在测试失败时 df1
列用 NaN 填充(如上例所示)。
通过这种方式,我可以在几个步骤中模拟我的嵌套 for-for 循环,希望这样会更快?
任何建议/提示/示例将不胜感激。
谢谢
最佳答案
pandas 目前缺乏对“附近”查询的直接支持,尽管我有一个 pull request最多添加一些基本功能(对于您的用例来说还不够)。
幸运的是,科学的 Python 生态系统为您提供了自己完成这项工作所需的工具。
加入附近位置的有效方法是使用树数据结构,如 scikit-learn documentation 中所述。 . SciPy 和 scikit-learn 都有合适的 KDTree 实现。
完全使用临时规则并不容易(或高效),但只要您有明确定义的距离度量,就可以高效地进行最近邻查找。我相信 scikit-learn 的 KDTree 甚至可以让您定义自己的距离度量,但我们将坚持使用正常的欧几里德距离来继续您的示例:
from scipy.spatial import cKDTree as KDTree
import pandas as pd
# for each row in df2, we want to join the nearest row in df1
# based on the column "d"
join_cols = ['d']
tree = KDTree(df1[join_cols])
distance, indices = tree.query(df2[join_cols])
df1_near_2 = df1.take(indices).reset_index(drop=True)
left = df1_near_2.rename(columns=lambda l: 'x_' + l)
right = df2.rename(columns=lambda l: 'y_' + l)
merged = pd.concat([left, right], axis=1)
这导致:
x_a x_b x_c x_d x_e y_a y_b y_c y_d y_e
0 56 38 11 10 65 56 38 11 10 65
1 31 12 26 99 71 145 108 123 84 3
2 56 38 11 10 65 113 144 183 7 12
3 31 12 26 99 71 144 60 46 106 148
4 31 12 26 99 71 57 87 51 95 187
5 31 12 26 99 71 41 12 26 99 71
6 70 49 40 227 1 80 49 40 227 1
7 3 85 32 46 70 3 85 32 46 70
8 56 38 11 10 65 107 95 81 15 25
9 56 38 11 10 65 138 97 38 28 171
如果您想根据多个列的邻近性进行合并,只需设置 join_cols = ['d', 'e', 'f']
即可。
关于python - 按复杂标准合并/加入 2 个 DataFrame,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28177114/
我最近在读 CSAPP。在 10.9 节中,它说标准 I/O 不应该与 socket 一起使用,原因如下: (1) The restrictions of standard I/O Restricti
似乎是一个足够标准的问题,可以保证解决方案中的标准设计: 假设我想在文件中写入 x+2(或更少)个字符串。 x 字符串构成一个部分的内容,这两个字符串构成该部分的页眉和页脚。要注意的是,如果内容中没有
代码版本管理 在项目中,代码的版本管理非常重要。每个需求版本的代码开发在版本控制里都应该经过以下几个步骤。 在master分支中拉取该需求版本的两个分支,一个feature分支,
我有以下sql查询,我需要获取相应的hibernate条件查询 SELECT COUNT(DISTINCT employee_id) FROM erp_hr_payment WHERE payment
所以我正在编写一些代码,并且最近遇到了实现一些 mixin 的需要。我的问题是,设计混音的正确方法是什么?我将使用下面的示例代码来说明我的确切查询。 class Projectile(Movable,
我的环境变量包含如下双引号: $echo $CONNECT_SASL_JAAS_CONFIG org.apache.kafka.common.security.plain.PlainLoginModu
示例: /** * This function will determine whether or not one string starts with another string. * @pa
有没有办法在 Grails 中做一个不区分大小写的 in 子句? 我有这个: "in"("name", filters.tags) 我希望它忽略大小写。我想我可以做一个 sqlRestriction
我搜索了很长时间,以查找将哪些boost库添加到std库中,但是我只找到了一个新库的完整列表(如此处:http://open-std.org/jtc1/sc22/wg21/docs/library_t
我已经通过使用这个肮脏的黑客解决了我的问题: ' Filter managerial functions ActiveSheet.Range("$A$1:$BW$2211").Auto
因此,我很难理解我需要遵循的标准,以便我的 Java 程序能够嵌入 HTML。我是否只需将我的主类扩展到 Applet 类,或者我还需要做更多的事情吗?另外,在我见过的每个 Applet 示例中,它都
我对在 Hibernate 中使用限制有疑问。 我必须创建条件,设置一些限制,然后选择日期字段最大值的记录: Criteria query = session.createCriteria(Stora
我有标准: ICriteria criteria = Session.CreateCriteria() .SetFetchMode("Entity1", FetchMo
我很难编写条件来选择所有子集合或孙集合为空的实体。我可以将这些作为单独的条件来执行,但我无法将其组合成一个条件。 类结构: public class Component { p
@Entity class A { @ManyToMany private List list; ... } @Entity class B { ... } 我想使用条件(不是 sql 查询)从 A
我的数据库中有以下表结构: Table A: Table B: Table C: _______________
请帮助我: 我有下一张 table : 单位 ID 姓名 用户 ID 姓名 利率 单位 ID 用户 ID 我不明白如何从 SQL 创建正确的条件结构: 代码: SELECT * FROM Unit W
我正在构建一个包含项目的网站,每个项目都有一个页面,例如: website.com/book/123 website.com/film/456 website.com/game/789 每个项目都可以
我需要使用两个属性的组合来过滤结果列表。一个简单的 SQL 语句如下所示: SELECT TOP 10 * FROM Person WHERE FirstName + ' ' + LastName L
我有一个“ super 实体”SuperEntity 和三个扩展父类(super class)的实体 ChildEntity1、...、ChildEntity3。 搜索数据库中的所有实体很容易,即我们
我是一名优秀的程序员,十分优秀!