我有两张桌子。一个(下面的df)大约有18,000行,另一个(下面的映射文件)大约有80万行。我需要一个可以与如此大的DataFrames一起使用的解决方案。
这是一个玩具示例:表1-df
Sample Chr Start End Value
S1 1 100 200 1
S1 2 200 250 1
S2 1 50 75 5
S2 2 150 225 4
表2-映射文件
Name Chr Position
P1 1 105
P2 1 60
P3 1 500
P4 2 25
P5 2 220
P6 2 240
我正在尝试执行以下操作(我的语法是错误的,但是我认为这个想法会出现):
for mapline in mapfile:
for dfline in df:
if df[dfline]['Chr'] == mapfile[mapline]['Chr']
if mapfile[mapline]['Position'] > df[dfline]['Start'] & mapfile[mapline]['Position'] < df[dfline]['End']
newdf[['Name','Chr','Position','Value', 'Sample']] = pd.DataFrame([ mapfile[mapline]['Name'], mapfile[mapline]['Chr'], mapfile[mapline]['Position'], df[dfline]['Value'], df[dfline]['Sample'] ] )
换句话说:我需要遍历mapfile中的每个项目(行),看看它的位置是否在df中每个CHR的任何START和END之间。如果是这样,我需要使用两个表中的“名称”,“色度”,“位置”,“样本”和“值”字段将其添加到新文件中。
玩具数据输出表:
Name Chr Position Value Sample
P1 1 105 1 S1
P2 1 60 5 S2
P5 2 220 1 S1
P5 2 220 4 S2
P6 2 240 1 S1
到目前为止:我已经了解了上面的内容,并且在确定语法以在python中进行常规循环时遇到了问题。但是,我的理解是,使用pandas或NumPy这样的包可能会容易得多?请帮助我找到最有效的方法,此过程中对语法的一些帮助将非常有用。
我尝试过但无法成功的一些相关文章
什么是通过熊猫遍历数据框的最有效方法是什么?
如何在Pandas的DataFrame中的行上进行迭代?
将列追加到pandas数据框
基于pandas中的其他列值有条件地填充列值
您可以使用IIUCread_csv
和merge
:
import pandas as pd
import io
temp1=u"""Sample;Chr;Start;End;Value
S1;1;100;200;1
S1;2;200;250;1
S2;1;50;75;5
S2;2;150;225;4"""
#after testing replace io.StringIO(temp1) to filename
dfline = pd.read_csv(io.StringIO(temp1), sep=";")
temp2=u"""Name;Chr;Position
P1;1;105
P2;1;60
P3;1;500
P4;2;25
P5;2;220
P6;2;240"""
#after testing replace io.StringIO(temp2) to filename
mapfile = pd.read_csv(io.StringIO(temp2), sep=";")
print dfline
Sample Chr Start End Value
0 S1 1 100 200 1
1 S1 2 200 250 1
2 S2 1 50 75 5
3 S2 2 150 225 4
print mapfile
Name Chr Position
0 P1 1 105
1 P2 1 60
2 P3 1 500
3 P4 2 25
4 P5 2 220
5 P6 2 240
#merge by column Chr
df = pd.merge(dfline, mapfile, on=['Chr'])
#select by conditions
df = df[(df.Position > df.Start) & (df.Position < df.End)]
#subset of df
df = df[['Name','Chr','Position','Value', 'Sample']]
print df
Name Chr Position Value Sample
0 P1 1 105 1 S1
4 P2 1 60 5 S2
7 P5 2 220 1 S1
8 P6 2 240 1 S1
10 P5 2 220 4 S2
#if you need reset index
print df.reset_index(drop=True)
Name Chr Position Value Sample
0 P1 1 105 1 S1
1 P2 1 60 5 S2
2 P5 2 220 1 S1
3 P6 2 240 1 S1
4 P5 2 220 4 S2
问题内容: 我有一个脚本可以更新5-10列的数据,但有时起始csv与结束csv相同,因此我不想写相同的csvfile,而是希望它不执行任何操作… 如何比较两个数据框以检查它们是否相同? 有任何想法吗? 问题答案: 您还需要小心创建DataFrame的副本,否则csvdata_old将使用csvdata更新(因为它指向相同的对象): 要检查它们是否相等,可以在此答案中使用assert_frame_e
问题内容: 我需要比较2个不同数据库中的数据库表,以了解差异所在,是否有一个简单的工具或脚本来实现? 问题答案: redgate SQL数据比较
我有以下spark数据帧。一个来自文本文件,另一个来自Databricks中的Spark表: 尽管数据完全相同,但以下代码报告了差异。我希望df3为空: 我需要在比较之前订购数据吗?-如果是,我该怎么做 我看不出上面的连接是在哪里完成的。它将如何匹配行?[ID]和[帐户]是主键 以上是比较2个数据帧的最佳方法吗 这是数据-其中[ID]和[帐户]是主键
问题内容: 我有2个数据框,如下所示: 最后,我想得到的是: 因此,我想比较两个数据帧,我想查看第一数据帧(对于列A和B)的哪些行与第二数据帧(列K和L)相同,并在第一数据帧的列D上分配1。 我可以使用for循环,但是输入大量条目会很慢。 任何线索或建议将不胜感激。 问题答案: 这是我解决的方法:
问题内容: 是否有任何方法可以接收2个JSON对象并将其进行比较以查看是否有任何数据已更改? 编辑 在审查评论之后,需要进行一些澄清。 JSON对象定义为 “一组无序的名称/值对。一个对象以{(左括号)开始,以}(右括号)结束。每个名称后面都带有:(冒号),名称/值对之间以,(逗号)分隔。 ”。- json.org 我的目标是能够简单地比较2个JSON对象文字。 我不是javascript专家,所
问题内容: 如何比较javascript中的2个函数?我不是在谈论内部参考。说 可以比较和吗? 问题答案: