2014-01-11 60 views
5

我知道熊貓數據框類型有能力測試它的值的邏輯。熊貓在Python列表中的布爾操作

下面的代碼:

import pandas as pd 
data = pd.DataFrame(columns=['a', 'b', 'c']) 
data = data.append({'a': 'I have data', 'b': 'no more complexe', 'c': 024204}, ignore_index=True) 
data = data.append({'a': 'audoausd', 'b': '2048rafaf', 'c': 29313}, ignore_index=True) 
data = data.append({'a': 'koplak ente gan', 'b': 'ente g bisa koplak', 'c': 29313}, ignore_index=True) 

現在我們有以下數據框:

    a     b  c 
0  I have data no more complexe 10372 
1   audoausd   2048rafaf 29313 
2 koplak ente gan ente g bisa koplak 29313 

測試C列的邏輯值,並將其保存到變量

c = data.c > 20000 

會將c設置爲以下值

0 False 
1  True 
2  True 
Name: c, dtype: bool 

測試列b的邏輯值,並將其保存到變量

b = data.b.str.contains('koplak') 

b值爲

0 False 
1 False 
2  True 
Name: b, dtype: bool 

以及用於列

a = data.a.str.contains('koplak') 

0 False 
1 False 
2  True 
Name: b, dtype: bool 

當我做一個& b比較這一切的價值觀&Ç將返回:

0 False 
1 False 
2  True 
dtype: bool 

它不能很好地塑造硬編碼的情況下有很多列涉及,所以我儘量讓含有列表所有列邏輯

logic = [a, b, c] 

如何比較的所有物品將自動獲得& b & C測試結果?

回答

8

a & b & c相當於

import functools 
print(functools.reduce(lambda x,y: x & y, [a, b, c])) 

這將產生

0 False 
1 False 
2  True 
dtype: bool 

不像我的下面(暗示np.logical_and.reduce)原來的答案,我相信functools.reduce(lambda x,y: x & y, [a, b, c])將忠實地返回相同系列的a & b & c

(在Python2.7,reduce是一個內置函數。functools.reduce是相同的功能reduce在Python3,reduce從內建移除,只functools.reduce依然存在。所以,未來證明你的代碼,使用functools.reduce)。


編輯:使用np.logical_and.reduce([logic])可能不適用於所有情況。這是一個反例:

import pandas as pd 
import numpy as np 
x = pd.Series([True,True,False,False], index=[1,2,3,4]) 
y = pd.Series([True,True,False,False], index=[1,2,3,4]) 
print(x & y) 

打印

1  True 
2  True 
3 False 
4 False 
dtype: bool 

np.logical_and.reduce([x,y])引發一個ValueError

print(np.logical_and.reduce([x,y])) 
    File "/data1/unutbu/.virtualenvs/dev/local/lib/python2.7/site-packages/pandas-0.13.0_98_gd9b0c1f-py2.7-linux-i686.egg/pandas/core/generic.py", line 665, in __nonzero__ 
    .format(self.__class__.__name__)) 
ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 
+0

這是非常有用的;你可以做一個公關加入食譜嗎?你可以使用這個鏈接一個不錯的標題/描述 – Jeff