如何将数据框架中的每个组的行变成列?

问题描述 投票:0回答:3
我想将每个值从每个组col1,col2,col3中的每个值放入每个列中。如此期望的结果是:

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
如何做?是否有任何功能将这些行变成组内的列?

如果大多数组都存在(请参见注释),那么您可以将

first

python python-3.x dataframe function
3个回答
1
投票
功能与

groupby

语句结合使用。您应该定义自己的
last
函数,该功能将返回组的最后一个元素(例如,如果存在,则是第二个值)。如果它不存在,则意味着组长度等于
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))

这里是另一个剥夺:

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>

它在前三列中还可以与多个重复项一起使用作为奖励

0
投票

对于任何数量的组,这可能是一个更干净的解决方案:

https://stackoverflow.com/a/47849462/29951167

,但是,由于Col4不是数字,因此需要像这样修改:

0
投票
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


最新问题
© www.soinside.com 2019 - 2025. All rights reserved.