[英]How to filter based on the some part of a value of rows in a pandas dataframe
[英]Some ide on how to filter a pandas dataframe
我想過濾 pandas 數據幀。 顯然我可以用幾個循環來做到這一點,但對於大量數據來說效率不高,所以我想問一些關於如何做的想法。
我有組織的數據,例如,
c1=t c2=detector(1,2,or3) c3
1 1
1 2
2 1
2 2
2 3
3 2
3 3
4 1
4 3
...
它可以看作是模擬的次數, c1=t
, c2
是模擬的檢測器類型。 有時您不會隨機獲得其中一個檢測器的數據,因此我想將每個數據幀中的數據划分為相同的檢測器時間。
第一列是索引遞增列,第二列只能有3個值(1,2,3),我想把這個dataframe分成3個,
c1
c1
的所有行,其中您有 1 個和 3 個值c1
,您有 2 個和 3 個值 沒有唯一的c1
行。
我想知道如何使用 pythonic 方法來過濾這個 dataframe。
您可以聚合set
,因此c2
中值的排序並不重要:
s = df.groupby('c1')['c2'].agg(set)
print (s)
c1
1 {1, 2}
2 {1, 2, 3}
3 {2, 3}
4 {1, 3}
Name: c2, dtype: object
然后通過匹配集過濾c1
:
df1 = df[df['c1'].isin(s.index[s.eq(set([1,2]))])]
df2 = df[df['c1'].isin(s.index[s.eq(set([1,3]))])]
df3 = df[df['c1'].isin(s.index[s.eq(set([2,3]))])]
df4 = df[df['c1'].isin(s.index[s.eq(set([1,2,3]))])]
另一個想法是創建 DataFrames 字典:
s = df.groupby('c1')['c2'].agg(set)
print (s)
c1
1 {1, 2}
2 {1, 2, 3}
3 {2, 3}
4 {1, 3}
Name: c2, dtype: object
vals = [(1,2),(1,3),(2,3),(1,2,3)]
dfs = {'_'.join(map(str, x)): df[df['c1'].isin(s.index[s.eq(set(x))])] for x in vals}
print (dfs)
{'1_2': c1 c2
0 1 1
1 1 2, '1_3': c1 c2
7 4 1
8 4 3, '2_3': c1 c2
5 3 2
6 3 3, '1_2_3': c1 c2
2 2 1
3 2 2
4 2 3}
print (dfs['1_2'])
print (dfs['1_3'])
print (dfs['2_3'])
print (dfs['1_2_3'])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.