我在Python中有一个数据框,例如A
,它具有多个列,包括名为ECode
和FG
的列。我还有另一个Pandas数据框B
,它也有多个列,包括名为ECode
,F Gping
的列(请注意F Gping
的列名中的空格)和EDesc
。我想做的是根据以下条件在数据帧A中创建一个名为EDesc
的新列(注意EDesc
,FG
和F Gping
包含{{1} }类型值(文本),而其余列为数字/浮点类型。此外,数据帧String
和A
具有不同的维度(具有不同的行和列,我想检查特定的相等性)数据框列中的值):-
B
中的所有行,其中A
中的值与数据框ECode
中的值ECode
匹配,然后在新列B
中要在数据框EDesc
中创建,请添加与A
中的EDesc
相同的值。B
中A
中的值与FG
值匹配的所有行,在F Gping
中的新列EDesc
中添加相同的值就像A
中的EDesc
。B
中新创建的EDesc
列仍缺少值/ NaN,则将字符串值A
添加到数据框{{1}中的所有行}的MissingValue
列。我尝试使用A
循环以及列表理解,但是它们无助于实现这一目标。此外,EDesc
的列名for
中的空格也给访问该字段带来了麻烦,好像我可以像F Gping
一样访问它,但这并不能解决问题。在这方面的任何帮助都将受到赞赏。
答案 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)