是沒有問題的,比較的元組
import pandas as pd
data = [
[1, (2,3,8)],
[2, (12,13,18)],
[3, (2,3,8)],
[4, (1,2,3,8,10)],
[5, (8,3,2)],
]
#----------------------------------------------
df_tuple = pd.DataFrame(data, columns=['a','b'])
print '\n DataFrame with tuples \n'
print df_tuple
print '\n tuple == : \n'
print df_tuple['b'] == (2,3,8)
print df_tuple[ df_tuple['b'] == (2,3,8) ]
print '\n tuple eq() : \n'
print df_tuple['b'].eq((2,3,8))
print df_tuple[ df_tuple['b'].eq((2,3,8)) ]
#----------------------------------------------
結果
DataFrame with tuples
a b
0 1 (2, 3, 8)
1 2 (12, 13, 18)
2 3 (2, 3, 8)
3 4 (1, 2, 3, 8, 10)
4 5 (8, 3, 2)
tuple == :
0 True
1 False
2 True
3 False
4 False
Name: b, dtype: bool
a b
0 1 (2, 3, 8)
2 3 (2, 3, 8)
tuple eq() :
0 True
1 False
2 True
3 False
4 False
Name: b, dtype: bool
a b
0 1 (2, 3, 8)
2 3 (2, 3, 8)
但是有比較名單的問題,我不知道爲什麼。
但是,您需要列表中的所有或幾個項目的行[2,3,8]
,所以我會使用apply()
與自己的功能。
import pandas as pd
#----------------------------------------------
data = [
[1, [2,3,8]],
[2, [12,13,18]],
[3, [2,3,8]],
[4, [1,2,3,8,10]],
[5, [8,3,2]],
]
#----------------------------------------------
df_list = pd.DataFrame(data, columns=['a','b'])
print '\n DataFrame with lists \n'
print df_list
print '\n test: \n'
# test if any element from data list is in [2,3,8]
def test(data):
return any(x in [2,3,8] for x in data)
print df_list['b'].apply(test)
print df_list[ df_list['b'].apply(test) ]
#----------------------------------------------
結果
DataFrame with lists
a b
0 1 [2, 3, 8]
1 2 [12, 13, 18]
2 3 [2, 3, 8]
3 4 [1, 2, 3, 8, 10]
4 5 [8, 3, 2]
test:
0 True
1 False
2 True
3 True
4 True
Name: b, dtype: bool
a b
0 1 [2, 3, 8]
2 3 [2, 3, 8]
3 4 [1, 2, 3, 8, 10]
4 5 [8, 3, 2]
更多有用的版本 - 與第二個參數:
test_any
回True
如果任何元素從數據名單上預計列表
def test_any(data, expected):
return any(x in expected for x in data)
print df_list['b'].apply(lambda x:test_any(x,[2,3,8]))
print df_list[ df_list['b'].apply(lambda x:test_any(x,[2,3,8])) ]
test_all
回報True
如果從數據列表中的所有元素是預計列表
def test_all(data, expected):
return all(x in expected for x in data)
print df_list['b'].apply(lambda x:test_all(x,[2,3,8]))
print df_list[ df_list['b'].apply(lambda x:test_all(x,[2,3,8])) ]
您可以把 'x' 和[2,3,8]
得到True
如果任何元素從預計列表在個數據列表
print df_list[ df_list['b'].apply(lambda x:test_any_2([2,3,8], x)) ]
拿到如果從所有元素預期名單True
上數據列表
print df_list[ df_list['b'].apply(lambda x:test_all_2([2,3,8], x)) ]
此設置(將列表作爲單個列)不是標準的,並且有許多缺點。你是否知道這個決定的利弊,並有意設置你的數據庫?如果沒有,分享更多關於您的最終目標或您試圖組織什麼樣的數據,並且我們可能會建議更好的數據庫策略。 – FooBar
(你可以通過複雜的答案來看到設置的尷尬 - 通常應該是小菜一碟) – FooBar
@FooBar你是對的 - 一個單元中的許多元素是書中描述的'antipattern'之一[SQL反模式](http://www.amazon.com/SQL-Apatpatterns-Programming-Pragmatic-Programmers/dp/1934356557) – furas