1. 程式人生 > 其它 >提取series中的數值_pd.loc[行,列]怎麼有時候會返回一個值,有時候又返回一個series呢?...

提取series中的數值_pd.loc[行,列]怎麼有時候會返回一個值,有時候又返回一個series呢?...

技術標籤:提取series中的數值

2041879f4866f2fa026ecc73fd7007af.png

處理資料的時候, 我們經常需要從dataframe里根據行和列的條件提取特定格子的值, 比如下面的一段程式碼:

import pandas as pd
list_1 = [
    {'a':1,'b':1,'value':10},
    {'a':1,'b':2,'value':20},
    {'a':2,'b':1,'value':30},
    {'a':2,'b':2,'value':40},
]
df = pd.DataFrame(list_1).set_index(['a','b'])
df.loc[(1,2),'value']

上述程式碼將a和b共同作為index (多重index在很多時候有不錯的應用), 返回結果是20, 型別是numpy.int64. 如果將程式碼做一下修改, 給資料框增加一行:

import pandas as pd
list_2 = [
    {'a':1,'b':1,'value':10},
    {'a':1,'b':2,'value':20},
    {'a':2,'b':1,'value':30},
    {'a':2,'b':2,'value':40},
    # 下面是新增的一行
    {'a':2,'b':2,'value':45},
]
df = pd.DataFrame(list_2).set_index(['a','b'])
df.loc[(1,2),'value']

a為2,b為2的情況多了一個value為45的記錄, 現在再用df.loc[(1,2),'value']雖然還是隻有{'a':1,'b':2,'value':20}匹配, 但是仍舊是以pandas.core.series.Series的形式返回, 這個可以自己去用type命令印證一下.

為什麼會這樣呢?

我們先看另外一個dataframe

import pandas as pd
list_3 = [
    {'a':1,'value':10},
    {'a':2,'value':20},
    {'a':2,'value':30},
]
df = pd.DataFrame(list_3).set_index('a')
print(df.loc[1,'value'],type(df.loc[1,'value']))
print(df.loc[2,'value'],type(df.loc[2,'value']))

上面程式碼兩個print輸出的結果分別是:

  1. 10 <class 'numpy.int64'>
a
2    20
2    30
Name: value, dtype: int64 <class 'pandas.core.series.Series'>

從上面三個例子可以看到:

  1. 在單一index的情況下, 如果loc匹配的結果是唯一的, 會直接返回匹配的值, 如果不是唯一的, 會返回所有結果組成的Series.
  2. 在多重index的情況下, 如果index中沒有重複值(第一個例子), 則loc直接返回匹配的值
  3. 在多重index的情況下, 如果index中有重複值(第二個例子), 則loc無論匹配的是不是唯一值, 都會返回所有結果組成的Series

這就會給程式帶來很大的不確定性, 所以在使用loc以前, 真的很應該瞭解一下你的index是不是有重複值的. 好吧, pandas在使用set_index的時候是允許index中出現重複值的.

這個檢驗並不難做, 以第二個例子的程式碼做點更改:

import pandas as pd
list_2 = [
    {'a':1,'b':1,'value':10},
    {'a':1,'b':2,'value':20},
    {'a':2,'b':1,'value':30},
    {'a':2,'b':2,'value':40},
    {'a':2,'b':2,'value':45},
]
df = pd.DataFrame(list_2).set_index(['a','b'])
index_is_duplicated = df.index.duplicated()
print(index_is_duplicated)

輸出的結果是[False False False False True], 最後一項的index和之前重複了, 所以結果是True, 如果只是單純想判斷一下有沒有重複值, 求一下和然後判斷是否大於0就好了.

如果發現index有重複值, 這個時候就要具體情況具體分析了, 但是首先還是應該明確到底有沒有重複, 對吧