簡體   English   中英

如何將 dataframe 中每組中的行變成列?

[英]How to turn rows in each group in dataframe into columns?

我有一個 dataframe:

col1  col2  col3   val  col4
a1    b1     c1    10    dd
a1    b1     c1    15    kk
a2    b2     c2    20    ff
a2    b2     c2    35    mm
a3    b3     c3    9     sd

我想將每個組 col1、col2、col3 中的“val”列中的每個值放入每一列。 所以想要的結果是:

col1  col2  col3   val_1  col4_1  val_2  col4_2
a1    b1     c1     10     dd      15      kk
a2    b2     c2     20     ff      35      mm
a3    b3     c3     9      sd      NA      NA

怎么做? 是否有任何 function 將這些行轉換為組內的列?

如果最多存在兩個組(請參閱注釋),那么您可以將firstlast函數與groupby語句結合使用。 你只需要定義你自己的last function,它會返回一個組的最后一個元素(對於你的例子,它是第二個值)如果它存在的話。 如果它不存在,這意味着組長度等於1 ,它將返回您nan

代碼:

df = pd.DataFrame(
    {"col1": ["a1", "a1", "a2", "a2", "a3"],
     "col2": ["b1", "b1", "b2", "b2", "b3"],  
     "col3": ["c1", "c1", "c2", "c2", "c3"],
     "val": [10, 15, 20, 35, 9],
     "col4": ["dd", "kk", "ff", "mm", "sd"]}
)

last_check = lambda x: pd.NA if len(x) == 1 else x.iloc[-1]

df.groupby(["col1", "col2", "col3"], as_index=False)\
    .agg(val_1=("val", "first"),
         col4_1=("col4", "first"),
         val_2=("val", last_check),
         col4_2=("col4", last_check))

Output:

col1  col2  col3  val_1  col4_1  val_2  col4_2          
a1    b1    c1    10     dd      15      kk
a2    b2    c2    20     ff      35      mm
a3    b3    c3    9      sd      <NA>   <NA>

這是另一種方法:

cols = ['col1','col2','col3']

res = df.assign(num=df.groupby(cols).cumcount()+1).pivot(index=cols,columns='num')
res.columns = [f'{x}_{y}' for x,y in res.columns]

print(res)
'''
                val_1  val_2 col4_1 col4_2
col1 col2 col3                            
a1   b1   c1     10.0   15.0     dd     kk
a2   b2   c2     20.0   35.0     ff     mm
a3   b3   c3      9.0    NaN     sd    NaN

作為獎勵,它還可以在前三列中使用多個重復項

暫無
暫無

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

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