簡體   English   中英

Pandas DataFrame 如何按指定列的值對行進行分組(透視?),但保留原始索引?

[英]Pandas DataFrame how to group (pivot?) rows by values of specified columns, but keeping the original index?

我正在嘗試使用 Pandas 實現變量消除算法。 如果有人熟悉求和步驟,請給出一個表,其中 a、b、c 是變量(不一定是布爾值),f 是給定這些變量值的某個函數(因子)。

       a      b      c      f
0   True   True   True  0.015
1   True   True  False  0.035
2   True  False   True  0.270
3   True  False  False  0.180
4  False   True   True  0.030
5  False   True  False  0.070
6  False  False   True  0.240
7  False  False  False  0.160

我要總結f的所有行的S其中(a,c)=(T,T)f所有行的S其中(a,c)=(T,F) (F,T) (F,F) 結果看起來像

       a     c     f
0   True  True  0.285
1   True   False  0.215
2   False  True  0.27
3   False  False  0.23

因此名稱為“sum-out ( b )”。

我能得到的最接近的是使用pd.pivot_table(df, index=df.index.values, columns=['a', 'c'], values='f', aggfunc=np.sum, fill_value=0).sum()返回

a      c
False  False    xxx
       True     xxx
True   False    xxx
       True     xxx

另一個unstack可以給我們

c      False  True
a
False   xxx   xxx
True    xxx   xxx

這仍然不是我想要的。

請注意,我可以擁有任意多個變量,以及任意多個要求和(或保留)的變量。 所以雖然在這種情況下我可以做pd.pivot_table(df, index=<some of the var left, eg a>, columns=<other var left, eg c>, values='f', aggfunc=np.sum)為了得到相同的結果,在其他情況下可能只剩下一個變量,或者太多。

變量可能不是布爾類型,但它們應該具有有限和離散域。

另請注意,我這里的索引只是無意義的虛擬索引。 通過“保持原始索引”,我的意思是讓它們虛擬,但不知何故只沿axis=0聚合。

另外,如果有人能提出一個更好的多維數組之類的數據結構來完成這項工作也可以。

您可以像這樣使用 groupby 和 agg 函數。

df.groupby(['a','c'])['f'].agg('sum').reset_index()

由於您不關心column 'b'您可以刪除它,然后按列'a' and 'c'分組,如下所示:

df1 = df[['a', 'c','f']]
df1 = df1.groupby(['a', 'c']).sum().reset_index()

這應該會返回您正在尋找的答案。 不要忘記重置結果數據幀的索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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