Python Pandas-比较2个数据框,多个参数

发布于 2021-01-29 14:59:40

我有两张桌子。一个(下面的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中的其他列值有条件地填充列值

关注者
0
被浏览
124
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    您可以使用IIUCread_csvmerge

    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
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看