4
我有一個數據框,有一列,我想groupby。在每個組中,我想執行檢查以查看第一個值是否小於第二個值乘以某個標量,例如, (x < y * .5)。如果是,則第一個值設置爲True,所有其他值爲False。否則,所有的值都是假的。熊貓集團指數
我這裏有一個簡單的數據幀:
d = pd.DataFrame(np.array([[0, 0, 1, 1, 2, 2, 2],
[3, 4, 5, 6, 7, 8, 9],
[1.25, 10.1, 2.3, 2.4, 1.2, 5.5, 5.7]]).T,
columns=['a', 'b', 'c'])
我可以得到一個堆疊GROUPBY得到,我想出來的數據a
:這導致三組
g = d.groupby('a')['c'].nsmallest(2).groupby(level='a')
,每個有2個條目。通過添加apply
,我可以調用一個函數返回一個布爾面膜:
def func(group):
if group.iloc[0] < group.iloc[1] * .5:
return [True, False]
else:
return [False, False]
g = d.groupby('a')['c'].nsmallest(2).groupby(level='a').apply(func)
不幸的是,這會破壞指數爲原始數據幀,並刪除處理,其中2個以上元素存在的情況下的能力。
兩個問題:
是否有可能維持在原來的數據幀索引並更新了GROUPBY結果列?由於
.nsmallest
調用結果爲'c'列中的一個系列,因此稍有不同。是否存在更優雅的方法來根據某些自定義條件(例如,自定義條件)爲數據框中的組計算布爾數組。這個比例測試。
按廣告方式工作。我還沒有意識到,轉換可以採取任意功能(在文檔中錯過了它)。謝謝! – Jzl5325