在三个DataFrame中查找复合键的存在,并相应地连接DataFrame

问题描述 投票:1回答:1

这个问题很难说。

以下是可重现示例的示例代码:

import numpy as np
import pandas as pd    

df1 = pd.DataFrame([['a', 1, 10, 1], ['a', 2, 20, 1], ['b', 1, 4, 1], ['c', 1, 2, 1], ['e', 2, 10, 1]])
df2 = pd.DataFrame([['a', 1, 15, 2], ['a', 2, 20, 2], ['c', 1, 2, 2]])
df3 = pd.DataFrame([['d', 1, 10, 3], ['e', 2, 20, 3], ['f', 1, 15, 3]])    

df1.columns = ['name', 'id', 'price', 'part']
df2.columns = ['name', 'id', 'price', 'part']
df3.columns = ['name', 'id', 'price', 'part']    



result = pd.DataFrame([['a', 1, 10, 15, 'missing'],
['a', 2, 20, 20, 'missing'],
['b', 1, 4, 'missing', 'missing'],
['c', 1, 2, 2, 'missing'],
['e', 2, 10, 'missing', 20],
['d', 1, 'missing', 'missing', 10],
['f', 1, 'missing', 'missing', 15]])    

result.columns = ['name', 'id', 'pricepart1', 'pricepart2', 'pricepart3']

所以有三个DataFrame:

df1

  name  id  price  part
0    a   1     10     1
1    a   2     20     1
2    b   1      4     1
3    c   1      2     1
4    e   2     10     1

df2

  name  id  price  part
0    a   1     15     2
1    a   2     20     2
2    c   1      2     2

df3

    name  id  price  part
0    d   1     10     3
1    e   2     20     3
2    f   1     15     3

nameid就像一个复合键。它可能存在于所有三个DataFrame中,只有三个DataFrame中的两个,仅存在于一个DataFrame中。为了表示name, id来自哪个DataFrame,在partdf1df2中存在df3列。

我正在寻找的结果是由result DataFrame给出的。

  name  id pricepart1 pricepart2 pricepart3
0    a   1         10         15    missing
1    a   2         20         20    missing
2    b   1          4    missing    missing
3    c   1          2          2    missing
4    e   2         10    missing         20
5    d   1    missing    missing         10
6    f   1    missing    missing         15

基本上,我想要每个nameid对被占。即使SAME nameid同时出现df1df2,我也希望price中的每个part都有单独的列,即使这两个部分/ DataFrame中的价格相同。

results DataFrame中,取row1,a 1 10 15 missing

这代表的是,name, ida 1的价格为10df115df2missingdf3

如果特定missing的行值是pricepart,那意味着name, id对没有出现在那个特定的DataFrame中!

我用qazxsw poi来表示DataFrame!所以,你可以假设qazxsw poi总是在partpart,总是1df12的总是df2

到目前为止..我真的只是做了,3

不确定这种方法是否会导致死路一条..

请记住,原始的三个DataFrame是df3 EACH。每个DataFrame可能包含也可能不包含pd.concat([df1, df2, df3])62245 rows × 4 columns对。如果nameid对出现在DataFrames的EVEN 1中,而不是其他的,我希望用其他DataFrames的name来计算。

python pandas dataframe join merge
1个回答
2
投票

您可以在使用id时使用missing

pd.merge
© www.soinside.com 2019 - 2024. All rights reserved.