簡體   English   中英

Pandas DataFrame 在子集中查找唯一值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM