[英]Pandas DataFrame finding unique values in subsets
關於熊貓的新手問題。
我似乎無法圍繞 pandas groupby 和其他方法來查找和定位子集中的唯一值。 更不用說高效而優雅地做到這一點了。
這是一個示例數據幀(非常簡化):
df = pd.DataFrame([
[1, 1, True, False, True, True],
[1, 2, True, False, True, True],
[1, 3, True, False, False, True],
[1, 4, True, True, True, True],
[2, 1, False, False, False, True],
[2, 2, True, True, True, True],
[2, 3, True, True, False, True],
[2, 4, True, True, True, True],
[3, 1, True, True, True, True],
[3, 2, True, True, True, True],
[3, 3, True, True, False, True],
[3, 4, True, True, True, True],
[4, 1, True, True, True, True],
[4, 2, True, True, True, True],
[4, 3, True, True, True, True],
[4, 4, True, True, True, True],
])
我想找到的分為兩類:
1/ 索引和列元組列表,我可以在其中找到僅在列中針對給定過濾器的相同值出現一次的 True 值,例如按第一列或第二列分組。
2/ 索引和列元組列表,我可以在其中找到僅連續出現一次的 True 值。
df['count'] = df.apply(lambda x: x[x == True].count(), axis = 1)
>>> df
0 1 2 3 4 5 count
0 1 1 True False True True 5
1 1 2 True False True True 4
2 1 3 True False False True 3
3 1 4 True True True True 5
4 2 1 False False False True 2
5 2 2 True True True True 4
6 2 3 True True False True 3
7 2 4 True True True True 4
8 3 1 True True True True 5
9 3 2 True True True True 4
10 3 3 True True False True 3
11 3 4 True True True True 4
12 4 1 True True True True 5
13 4 2 True True True True 4
14 4 3 True True True True 4
15 4 4 True True True True 4
首先,這計算的是那些,而不僅僅是 True 值,但我還沒有找到一種方法來選擇和僅在第 2-5 列上進行計數。
接下來,我真的想找出行中那些唯一 True 值的索引和列。
我希望得到的結果,結合第 1 點和第 2 點,是:
[(3, 3), (14, 4), (4, 5)]
沒有特別的順序。 任何指向實現類似目標的示例代碼的指針都將不勝感激。
我知道如何在程序上做到這一點,它相當簡單,但我想找到一種不涉及 for 循環的 Pandas 做事方式,作為學習更好地使用 Pandas 的一種方式。
用:
#filter columns between 2:6
#df1 = df.loc[:, 2:6]
#or select only boolean columns
df1 = df.select_dtypes(bool)
#filter rows with only one True per rows
s = df1[df1.sum(axis=1).eq(1)]
#filter rows by one True per groups per columns
f = lambda x: x.loc[:, x.sum(axis=0).eq(1)]
df2 = df1.groupby(df[0]).apply(f)
df3 = df1.groupby(df[1]).apply(f)
#join together and reshape
s = pd.concat([s, df2, df3]).stack()
#get tuples by filtering Trues
tup = s.index[s].tolist()
print (tup)
[(4, 5), (3, 3), (14, 4)]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.