2016-10-11 83 views
1

我有一系列的字符串,我需要使用len()對其應用布爾索引。Python Pandas:使用len()方法的系列上布爾索引的行爲不一致

在一種情況下,它的工作原理,在它沒有另一種情況:

工作情況下是在一個數據幀一groupby,然後對得到的系列一unique()apply(str)更改所得到numpy.ndarray條目爲字符串:

import pandas as pd 
df = pd.DataFrame({'A':['a','a','a','a','b','b','b','b'],'B':[1,2,2,3,4,5,4,4]}) 
dg = df.groupby('A')['B'].unique().apply(str) 
db = dg[len(dg) > 2] 

這只是正常工作,併產生期望的結果:

>>db 
Out[119]: '[1 2 3]' 

以下然而拋出KeyError: True

ss = pd.Series(['a','b','cc','dd','eeee','ff','ggg']) 
ls = ss[len(ss) > 2] 

兩個對象dgss只是字符串的系列:http://pandas.pydata.org/pandas-docs/stable/indexing.html#boolean-indexing

我:

>>type(dg) 
Out[113]: pandas.core.series.Series 

>>type(ss) 
Out[114]: pandas.core.series.Series 

>>type(dg['a']) 
Out[115]: str 

>>type(ss[0]) 
Out[116]: str 

如文檔描述我下面的語法可以看到潛在的衝突,因爲len(ss)本身返回系列本身的長度,現在該確切命令用於布爾索引ss[len(ss) > 2],但我希望這兩個例子都不起作用。

現在這種行爲似乎不一致,除非我失去了明顯的東西。

回答

2

我想你需要str.len,因爲Series每個值的需要長度:

ss = pd.Series(['a','b','cc','dd','eeee','ff','ggg']) 

print (ss.str.len()) 
0 1 
1 1 
2 2 
3 2 
4 4 
5 2 
6 3 
dtype: int64 

print (ss.str.len() > 2) 
0 False 
1 False 
2 False 
3 False 
4  True 
5 False 
6  True 
dtype: bool 

ls = ss[ss.str.len() > 2] 
print (ls) 
4 eeee 
6  ggg 
dtype: object 

如果使用len,得到的Series長度:

print (len(ss)) 
7 

另一種解決方案是applylen

ss = pd.Series(['a','b','cc','dd','eeee','ff','ggg']) 
ls = ss[ss.apply(len) > 2] 
print (ls) 
4 eeee 
6  ggg 
dtype: object 

第一個腳本錯誤,你需要applylen也:

df = pd.DataFrame({'A':['a','a','a','a','b','b','b','b'],'B':[1,2,2,2,4,5,4,6]}) 
dg = df.groupby('A')['B'].unique() 
print (dg) 
A 
a  [1, 2] 
b [4, 5, 6] 
Name: B, dtype: object 

db = dg[dg.apply(len) > 2] 
print (db) 
A 
b [4, 5, 6] 
Name: B, dtype: object 

如果演員名單到str,你(的[]數據length +長度+長度空格)的另一len

dg = df.groupby('A')['B'].unique().apply(str) 
print (dg) 
A 
a  [1 2] 
b [4 5 6] 
Name: B, dtype: object 

print (dg.apply(len)) 
A 
a 5 
b 7 
Name: B, dtype: int64 
+0

謝謝,這與兩者兼而有之。你能解釋一下,爲什麼第一個例子還在工作呢? – Khris

+0

是的,我得到另一種解決方案,與第一個代碼一起工作。 – jezrael

+1

如果將'df'改爲'df = pd.DataFrame({'A':['a','a','a','a','b','b',' b','b'],'B':[1,2,2,3,4,5,4,6]})'它不返回兩行。 – jezrael