【问题标题】:Python Pandas Dataframe, merge df rows while skipping overlapping rowsPython Pandas Dataframe,合并df行,同时跳过重叠行
【发布时间】:2018-04-07 09:13:17
【问题描述】:

标题没有明确的意义,但这是我能描述的最好的了。

我有如下所示的 DataFrame:

data1 = np.matrix([[4,75,2,5,84,2,6,5,554],[4,6,67,6,4,5,8,5,8]]).T
data2 = np.matrix([[3,46,4,555,556,557,558,559,560],[1,2,4,1,3,5,3,1,5]]).T

data1 = pd.DataFrame(data1)
data2 = pd.DataFrame(data2)

>>> data1
     0   1
0    4   4
1   75   6
2    2  67
3    5   6
4   84   4
5    2   5
6    6   8
7    5   5
8  554   8


>>> data2
     0  1
0    3  1
1   46  2
2    4  4
3  555  1
4  556  3
5  557  5
6  558  3
7  559  1
8  560  5

我想将data2 附加到data1 的底部。但是,我想追加data2的行,其column1值大于或等于554,这是data1column1的最后一行

这是我想要的输出:

>>> merged_df
         0   1
    0    4   4
    1   75   6
    2    2  67
    3    5   6
    4   84   4
    5    2   5
    6    6   8
    7    5   5
    8  554   8
    9  555   1
   10  556   3
   11  557   5
   12  558   3
   13  559   1
   14  560   5

所以,data2 的前几行在追加到data1 时会被跳过。

假设data1的最后一行是它的最大值,data2的行排在data1的最后一个值之后,即554

有没有什么优雅的方法可以使用 Pandas 工具箱完成这项工作?

【问题讨论】:

    标签: python pandas merge


    【解决方案1】:

    使用concat 和第二个过滤器DataFrame by boolean indexing

    print (data1.iloc[-1, 0])
    554
    
    df = pd.concat([data1, data2[data2[0] > data1.iloc[-1, 0]]], ignore_index=True)
    print (df)
          0   1
    0     4   4
    1    75   6
    2     2  67
    3     5   6
    4    84   4
    5     2   5
    6     6   8
    7     5   5
    8   554   8
    9   555   1
    10  556   3
    11  557   5
    12  558   3
    13  559   1
    14  560   5
    

    也可以通过max 值比较一般解决方案:

    df = pd.concat([data1, data2[data2[0] > data1[0].max()]], ignore_index=True)
    

    自定义列名的解决方案:

    data1 = pd.DataFrame(data1, columns=list('ab'))
    data2 = pd.DataFrame(data2, columns=list('ab'))
    
    print (data1.iloc[-1, data1.columns.get_loc('a')])
    554
    
    data22 = data2[data2['a'] > data1.iloc[-1, data1.columns.get_loc('a')]]
    df = pd.concat([data1, data22], ignore_index=True)
    print (df)
          a   b
    0     4   4
    1    75   6
    2     2  67
    3     5   6
    4    84   4
    5     2   5
    6     6   8
    7     5   5
    8   554   8
    9   555   1
    10  556   3
    11  557   5
    12  558   3
    13  559   1
    14  560   5
    

    【讨论】:

    • @EricKim - 很高兴能帮上忙!
    猜你喜欢
    • 2019-01-04
    • 2018-11-05
    • 1970-01-01
    • 2021-12-12
    • 2021-11-02
    • 1970-01-01
    • 2022-11-04
    • 2019-05-02
    • 2017-05-10
    相关资源
    最近更新 更多