Pandas:嵌套使用 .loc 会为同一字段返回不同的“类型”

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

为什么我在使用

.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
有什么不同,是因为它的嵌套使用吗?

python pandas indexing pandas-loc
1个回答
0
投票

您的第一种方法称为布尔索引,这会创建一个布尔系列并使用它来选择匹配的行。这可以产生 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
© www.soinside.com 2019 - 2024. All rights reserved.