如何使用相等条件处理基于另一个数据框的Pandas数据框?

时间:2019-04-06 10:18:52

标签: python pandas dataframe

我在Python中有一个数据框,例如A,它具有多个列,包括名为ECodeFG的列。我还有另一个Pandas数据框B,它也有多个列,包括名为ECodeF Gping的列(请注意F Gping的列名中的空格)和EDesc 。我想做的是根据以下条件在数据帧A中创建一个名为EDesc的新列(注意EDescFGF Gping包含{{1} }类型值(文本),而其余列为数字/浮点类型。此外,数据帧StringA具有不同的维度(具有不同的行和列,我想检查特定的相等性)数据框列中的值):-

  1. 首先,对于数据框B中的所有行,其中A中的值与数据框ECode中的值ECode匹配,然后在新列B中要在数据框EDesc中创建,请添加与A中的EDesc相同的值。
  2. 第二,对于数据帧BA中的值与FG值匹配的所有行,在F Gping中的新列EDesc中添加相同的值就像A中的EDesc
  3. 此后,如果B中新创建的EDesc列仍缺少值/ NaN,则将字符串值A添加到数据框{{1}中的所有行}的MissingValue列。

我尝试使用A循环以及列表理解,但是它们无助于实现这一目标。此外,EDesc的列名for中的空格也给访问该字段带来了麻烦,好像我可以像F Gping一样访问它,但这并不能解决问题。在这方面的任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:1)

我假设值在B ['ECode']和B ['F Gping']中是唯一的,否则当我们找到两个匹配的值时,我们必须选择给A ['EDesc']的值用于ECode或FG。

也许有一种更聪明的方法,但这是我要使用联接的方法:

示例数据框:

A = pd.DataFrame({'ECode': [1, 1, 3, 4, 6],
                  'FG': ['a', 'b', 'c', 'b', 'y']})
B = pd.DataFrame({'ECode': [1, 2, 3, 5],
                  'F Gping': ['b', 'c', 'x', 'x'],
                  'EDesc': ['a', 'b', 'c', 'd']})

它们看起来像:

A
   ECode FG
0      1  a
1      1  b
2      3  c
3      4  b
4      6  y

B
   ECode F Gping EDesc
0      1       b     a
1      2       c     b
2      3       x     c
3      5       x     d

首先让我们创建A ['EDesc'],说它是在ECode上将A和B连接起来的结果。我们将暂时使用EDesc作为索引:

A.set_index('ECode', inplace=True, drop=False)
B.set_index('ECode', inplace=True, drop=False)

A['EDesc'] = A.join(B, lsuffix='A')['EDesc']

之所以可行,是因为A.join(B,lsuffix ='A')的结果是:

       ECodeA FG  ECode F Gping EDesc
ECode                                
1           1  a    1.0       b     a
1           1  b    1.0       b     a
3           3  c    3.0       x     c
4           4  b    NaN     NaN   NaN
6           6  y    NaN     NaN   NaN

现在,使用FG上的匹配项来填充A ['EDesc']。同样的事情:

A.set_index('FG', inplace=True, drop=False)
B.set_index('F Gping', inplace=True, drop=False)

A['EDesc'].fillna(A.join(B, lsuffix='A')['EDesc'].drop_duplicates(), inplace=True)

之所以可行,是因为A.join(B,lsuffix ='A')的结果是:

   ECodeA FG EDescA  ECode F Gping EDesc
a       1  a      a    NaN     NaN   NaN
b       1  b      a    1.0       b     a
b       4  b    NaN    1.0       b     a
c       3  c      c    2.0       c     b
y       6  y    NaN    NaN     NaN   NaN

我们也删除了重复项,因为您可以看到索引中有两个b。

最后,让我们用“缺少”进行填充并重置索引:

A['EDesc'].fillna('Missing', inplace=True)
A.reset_index(drop=True, inplace=True)