[英]Sorting columns and selecting top n rows in each group pandas 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 將這些行轉換為組內的列?
如果最多存在兩個組(請參閱注釋),那么您可以將first
和last
函數與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.