我在合并2个pandas数据帧时遇到了问题。
a = [{'City':'CCC','ID':'BBB'},{'City':'AAA','ID':'DDD'},{'City':'CCC','ID':'HHH'}]
b = [{'City':'AAA','Name':'FFF'},{'City':'CCC','Name':'GGG'}]
df1 = pd.DataFrame(a)
df2 = pd.DataFrame(b)
df3 = pd.merge(df1,df2,how='left',on='City')
DF1:
City ID
0 CCC BBB
1 AAA DDD
2 CCC HHH
DF2:
City Name
0 AAA FFF
1 CCC GGG
DF3:
City ID Name
0 CCC BBB GGG
1 AAA DDD FFF
2 CCC HHH GGG
在上面的模拟代码中,df3['Name']
没有NaN
个值。但是,在我的真实数据框架中(我无法在此分享),相当于df3['Name']
的{{1}}值具有NaN
值,但它不应该因为df1['City']
和df2['City']
中的所有元素而'AAA' in df1['City']
匹配我的真实数据帧(不是这些模拟数据帧)。所以,我尝试排除故障并找到以下内容。
如果我尝试以下代码,
False
我得到True
,但它应该是'AAA'
,因为'AAA' in sorted(df1['City'])
位于该列中。
但是,如果我尝试以下代码,
True
我得到len([x for x in df1['City'] if x not in df2['City']])
,这是我所期待的。
另外,为了确认,我试试这个:
3
获得0
的输出,该输出应为numpy.vstack()
。
所以,我想知道上述问题的原因是什么,以及为什么合并真实数据帧不起作用的猜测?用于合并的列的元素是字符串。
答案 0 :(得分:2)
您在此示例中未获得任何NaN
,因为'City'
中df1
列的每个元素都位于'City'
的{{1}}列中。
尝试使用此示例
df2
您可以查看a = [
{'City':'CCC','ID':'BBB'},
{'City':'AAA','ID':'DDD'},
{'City':'CCC','ID':'HHH'},
{'City':'DDD','ID':'XXX'}
]
b = [
{'City':'AAA','Name':'FFF'},
{'City':'CCC','Name':'GGG'}
]
df1 = pd.DataFrame(a)
df2 = pd.DataFrame(b)
df3 = pd.merge(df1,df2,how='left',on='City')
df3
City ID Name
0 CCC BBB GGG
1 AAA DDD FFF
2 CCC HHH GGG
3 DDD XXX NaN
'AAA'
df3.City
或者
(df3.City == 'AAA').any()
True
答案 1 :(得分:2)
首先,您要仔细检查'AAA' in df3.City.tolist()
True
- 需要isin
来检查多个值,或者与AAA
进行比较,如果需要标量输出,请添加any
以检查至少一个{{1} }}
Series
True
#this check in index, not in values
print ('AAA' in df1['City'])
False
print (0 in df1['City'])
True
您在输出中的#this check in list from column
print (sorted(df1['City']))
['AAA', 'CCC', 'CCC', 'DDD']
print ('AAA' in sorted(df1['City']))
True
#pandas function for checking multiple values is isin
print (df1['City'].isin(['AAA', 'EEE']))
0 False
1 True
2 False
Name: City, dtype: bool
print (df1['City'].isin(['AAA', 'EEE']).any())
True
列中得到print (df3['City'] == 'AAA')
0 False
1 True
2 False
Name: City, dtype: bool
print ((df3['City'] == 'AAA').any())
True
,因为没有匹配 - 它会显示另一个答案。
您可以通过以下方式获得差异值:
NaN
或City
用于检查多个值,#borrowed sample from piRSquared's answer
a = [
{'City':'CCC','ID':'BBB'},
{'City':'AAA','ID':'DDD'},
{'City':'CCC','ID':'HHH'},
{'City':'DDD','ID':'XXX'}
]
b = [
{'City':'AAA','Name':'FFF'},
{'City':'CCC','Name':'GGG'}
]
df1 = pd.DataFrame(a)
df2 = pd.DataFrame(b)
print (np.setdiff1d(df1['City'], df2['City']))
['DDD']
用于反转布尔值掩码。
然后可以使用boolean indexing
。
isin