簡體   English   中英

將列添加到數據透視表 (pandas)

[英]Add columns to a pivot table (pandas)

我知道在 RI 中可以使用 tidyr 進行以下操作:

data_wide <- spread(data_protein, Fraction, Count)

和 data_wide 將從 data_protein 繼承所有未傳播的列。

Protein Peptide  Start  Fraction  Count
1             A    122       F1     1
1             A    122       F2     2     
1             B    230       F1     3     
1             B    230       F2     4

變成

Protein Peptide  Start  F1  F2
1             A    122   1  2
1             B    230   3  4     

但是在熊貓(Python)中,

data_wide = data_prot2.reset_index(drop=True).pivot('Peptide','Fraction','Count').fillna(0)

不繼承函數中未指定的任何內容(索引、鍵、值)。 因此,我決定通過 df.join() 加入它:

data_wide2 = data_wide.join(data_prot2.set_index('Peptide')['Start']).sort_values('Start')

但這會產生重復的肽,因為有幾個起始值。 有沒有更直接的方法來解決這個問題? 或者省略重復的連接的特殊參數? 提前謝謝你。

試試這個:

In [144]: df
Out[144]:
   Protein Peptide  Start Fraction  Count
0        1       A    122       F1      1
1        1       A    122       F2      2
2        1       B    230       F1      3
3        1       B    230       F2      4

In [145]: df.pivot_table(index=['Protein','Peptide','Start'], columns='Fraction').reset_index()
Out[145]:
         Protein Peptide Start Count
Fraction                          F1 F2
0              1       A   122     1  2
1              1       B   230     3  4

您還可以明確指定Count列:

In [146]: df.pivot_table(index=['Protein','Peptide','Start'], columns='Fraction', values='Count').reset_index()
Out[146]:
Fraction  Protein Peptide  Start  F1  F2
0               1       A    122   1   2
1               1       B    230   3   4

使用stack

df.set_index(df.columns[:4].tolist()) \
  .Count.unstack().reset_index() \
  .rename_axis(None, axis=1)

在此處輸入圖片說明

spreadpivot_wider中的tidyr取代。

如何使用datar遵循tidyr的API設計:

>>> from datar.all import f, tribble, pivot_wider
>>> data_protein = tribble(
...     f.Protein, f.Peptide,  f.Start,  f.Fraction,  f.Count,
...     1,         "A",        122,      "F1",        1,
...     1,         "A",        122,      "F2",        2,     
...     1,         "B",        230,      "F1",        3,     
...     1,         "B",        230,      "F2",        4,
... )
>>> data_wide = pivot_wider(data_protein, names_from=f.Fraction, values_from=f.Count)
>>> data_wide
  Peptide  Protein  Start  F1  F2
0       A        1    122   1   2
1       B        1    230   3   4

我是包的作者。 如果您有任何問題,請隨時提交問題。

暫無
暫無

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

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