根据特定的列数据合并两个数据集

时间:2019-07-17 00:14:39

标签: python pandas

我有两个大熊猫数据集

旧:

parseSomeField(overlay.a);

新:

|   alpha |       beta          | zeta        | id       | rand | numb|
| ------  | ------------------  | ------------| ------   | --- -| ----|
|   1     |        LA           |   bev       |  A100    | D    | 100 |
|   1     |        LA           |   malib     |  C150    | Z    | 150 |
|   2     |        NY           |   queens    |  B200    | N    | 200 |
|   2     |        NY           |   queens    |  B200    | N    | 200 |
|   3     |        Chic         |   lincpark  |  E300    | T    | 300 |
|   3     |        NY           |   Bronx     |  F300    | M    | 300 |

(列和数据没有什么特别的意义,仅是示例)。

我想以这样的方式合并数据集

  1. 如果old.alpha,old.beta和old.zeta =相应的新列,并且如果old.id = new.numb,则仅保留旧表中的条目。 (在这种情况下,将保留旧有皇后的第2行,而不是保留新皇后的第2行)

请注意,旧的第3行和第4行相同,但我们仍然保留两者。如果这些行在新行中有2个重复项,则我们将它们视为1-1对应。如果在第3行的新行中有3个重复项,而在旧行的第4行中有3个重复项,则将2个视为副本(我们不添加它们,但是在合并它们时会添加第三个)

  1. 如果old.alpha,old.beta和old.zeta =它们对应的新列,并且如果old.numb包含在new.numb中,则仅保留旧表中的条目。 (在这种情况下,具有lincpark的旧行的第5行将被保留,而具有lincpark的新行的第3行将被保留,因为new.numb中包含300))

  2. 否则,将新数据添加为新数据,保留新表的id和numb,并对旧表具有的任何额外列(新行包含好莱坞的第1行)为null

我已经尝试了各种合并方法以及drop_duplicates方法。后者的问题是我试图删除具有相同的alpha beta和zeta的重复项,但是由于行是完全相同的,因此经常从相同的数据源中删除它们。

这是合并时最终需要显示的内容。新行中的2行是重复的,其中一行是要添加的。

|   alpha |       beta          |    zeta        |  id   | numb |
| ------  | ------------------  | ---------------| ------| -----|
|   1     |        LA           |   Hwood        |  Q    | Q400 |
|   2     |        NY           |   queens       |  B    | B200 |
|   3     |        Chic         |   lincpark     |  D    | D300 |

1 个答案:

答案 0 :(得分:0)

我们可以通过几种方式合并两个数据帧。 python中最常见的方式是在Pandas中使用合并操作。 假设df1是新的,而df2是旧的

按照IF条件进行合并。

import pandas dfinal = df1.merge(df2, on="alpha", how = 'inner')

要基于不同数据框的列进行合并,可以特别指定左和右公共列名称,以防同一列的两个不同名称不明确,比如说-'idold'为'idnew'。

dfinal = df1.merge(df2, how='inner', left_on='alpha', right_on='id')

如果您想更具体一点,可以阅读pandas合并操作的文档。

还要指定If条件并按行执行合并操作,然后将剩余的列放在临时数据框中。并根据条件将值添加到该数据框。 我知道答案有点复杂,但您的问题也很复杂。干杯:)