为什么我在使用
.loc
进行索引时会得到 2 种不同的数据类型,即使我检索单个值/单元格。
背景:我正在
df_source
中查找 df_map
的值。当我执行以下索引时,我没有获得匹配的字符串数据类型。
# Just for reproducing. Note that we need to replace ```None``` with ```Nan```, as that is the case when we load the original dataframe from excel. But i cannot create a dict with ```Nan``` and so used ```None```
df_map = pd.DataFrame({'person': {0: 'jack',
1: 'jack',
2: 'jack',
3: 'harry',
4: 'harry',
5: 'harry'},
'country': {0: 'GE', 1: 'AUS', 2: 'AUS', 3: 'UK', 4: 'SP', 5: 'BR'},
'product': {0: 'AA', 1: 'NT', 2: 'NT', 3: 'AA', 4: 'NT', 5: 'NT'},
'account': {0: 'main1',
1: 'main2',
2: None,
3: 'main2',
4: 'main3',
5: 'sub4'}})
df_source = pd.DataFrame({'country': {0: 'GE', 1: 'AUS'},
'product': {0: 'AA', 1: 'NT'},
'account': {0: 'main1', 1: 'sub2'}})
-------- case 1 --------------
i=1
# search in df_map
person = df_map.loc[(pd.isna(df_map['account']))\
& (df_map['country'] == df_source.loc[i,'country']) \
& (df_map['product'] == df_source.loc[i,'product']), 'person']
type(person)
>pandas.core.series.Series
-------- case 2 ---------------
person = df_map.loc[1, 'person']
type(person)
>str
虽然两者都返回单个值,但两者是不同的类型。在这种情况下
.loc
有什么不同,是因为它的嵌套使用吗?
您的第一种方法称为布尔索引,这会创建一个布尔系列并使用它来选择匹配的行。这可以产生 0、1 或更多行。在这种特殊情况下只有一个。
无论如何,输出都是系列,而不是标量。
squeeze
:
i = 1
person = df_map.loc[(pd.isna(df_map['account']))
& (df_map['country'] == df_source.loc[i,'country'])
& (df_map['product'] == df_source.loc[i,'product']),
'person'].squeeze()
type(person)
# str