[英]How to find the values of a column such that no values in another column takes value greater than 3
我想找到與一列對應的值,以便另一列中的值沒有大於 3 的值。
例如,在以下數據框中
df = pd.DataFrame({'a':[1,2,3,1,2,3,1,2,3], 'b':[4,5,6,4,5,6,4,5,6], 'c':[4,3,5,4,3,5,4,3,3]})
我想要列 'a' 的值,其中 'c' 的所有值都大於 3。
我認為 groupby 是正確的方法。 我下面的代碼更接近它。
df.groupby('a')['c'].max()>3
a
1 True
2 False
3 True
4 False
Name: c, dtype: bool
上面的代碼給了我一個布爾框架。 我怎樣才能得到 'a' 的值,使其為真。 我希望我的輸出是 [1,3]
在非常大的數據框(超過 3000 萬行)上,是否有更好、更有效的方法來獲取它。
從您的代碼中,我看到您實際上想要輸出:
為了得到一些非空的結果,讓我們將源 DataFrame 更改為:
a b c
0 1 4 4
1 2 5 1
2 3 6 5
3 1 4 4
4 2 5 2
5 3 6 5
6 1 4 4
7 2 5 2
8 3 6 3
為了可讀性,讓我們將df按a分組並打印每個組。 執行此操作的代碼:
for key, grp in df.groupby('a'):
print(f'\nGroup: {key}\n{grp}')
給出結果:
Group: 1
a b c
0 1 4 4
3 1 4 4
6 1 4 4
Group: 2
a b c
1 2 5 1
4 2 5 2
7 2 5 2
Group: 3
a b c
2 3 6 5
5 3 6 5
8 3 6 3
現在看看每個組。 只有第2組滿足c列中每個元素都小於3 的條件。
所以實際上你需要一個groupby和filter ,只傳遞滿足上述條件的組:
要從“好”組中獲取完整行,您可以運行:
df.groupby('a').filter(lambda grp: grp.c.lt(3).all())
得到:
a b c
1 2 5 1
4 2 5 2
7 2 5 2
但是您只需要列中的值,而不需要重復。 所以將上面的代碼擴展為:
df.groupby('a').filter(lambda grp: grp.c.lt(3).all()).a.unique().tolist()
得到:
[2]
請注意,您的代碼: df.groupby('a')['c'].max() > 3
是錯誤的,因為它標記了最大大於3 的True組(而不是 ">" 應該有" <”)。
所以另一種解決方案是:
res = df.groupby('a')['c'].max()<3
res[res].index.tolist()
給出相同的結果。
另一種解決方案可以基於列表理解:
[ key for key, grp in df.groupby('a') if grp.c.lt(3).all() ]
細節:
for key, grp in df.groupby('a')
- 創建組,if grp.c.lt(3).all()
- 過濾組,key
(在開始時) - 將特定的組鍵添加到結果中。import pandas as pd
#Create DataFrame
df = pd.DataFrame({'a':[1,2,3,1,2,3,1,2,3], 'b':[4,5,6,4,5,6,4,5,6], 'c':[4,3,5,4,3,5,4,3,3]})
#Write a function to find values greater than 3 if found return.
def grt(x):
for i in x:
if i>3:
return(i)
#Groupby column a and call function grt
p = {'c':grt}
grp = df.groupby(['a']).agg(p)
print(grp)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.