可能是重復的,但我現在花了太多時間在谷歌上搜索而沒有任何運氣。假設我有一個資料框:
import pandas as pd
data = {"letters": ["a", "a", "a", "b", "b", "b"],
"boolean": [True, True, True, True, True, False],
"numbers": [1, 2, 3, 1, 2, 3]}
df = pd.DataFrame(data)
df
我想 1) 按字母分組,2) 如果布林值中的所有值都為 True,則取數字的平均值。在 RI 中會寫:
library(dplyr)
df %>%
group_by(letters) %>%
mutate(
condition = n_distinct(boolean) == 1,
numbers = ifelse(condition, mean(numbers), numbers)
) %>%
select(-condition)
這將導致以下輸出:
# A tibble: 6 x 3
# Groups: letters [2]
letters boolean numbers
<chr> <lgl> <dbl>
1 a TRUE 2
2 a TRUE 2
3 a TRUE 2
4 b TRUE 1
5 b TRUE 2
6 b FALSE 3
你會如何使用 Python 熊貓來做到這一點?
uj5u.com熱心網友回復:
我們可以使用惰性groupby和transform:
g = df.groupby('letters')
df.loc[g['boolean'].transform('all'), 'numbers'] = g['numbers'].transform('mean')
輸出:
letters boolean numbers
0 a True 2
1 a True 2
2 a True 2
3 b True 1
4 b True 2
5 b False 3
uj5u.com熱心網友回復:
另一種方法是使用 np.where。當一個組有一個唯一值時,求均值。它不保留數字的地方。下面的代碼
df['numbers'] =np.where(df.groupby('letters')['boolean'].transform('nunique')==1,df.groupby('letters')['numbers'].transform('mean'), df['numbers'])
letters boolean numbers
0 a True 2.0
1 a True 2.0
2 a True 2.0
3 b True 1.0
4 b True 2.0
5 b False 3.0
或者,在計算均值時屏蔽條件不適用的情況。
m=df.groupby('letters')['boolean'].transform('nunique')==1
df.loc[m, 'numbers']=df[m].groupby('letters')['numbers'].transform('mean')
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/380854.html
上一篇:如何動態使用CGRect()?
