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
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>
它在前三列中还可以与多个重复项一起使用作为奖励
对于任何数量的组,这可能是一个更干净的解决方案:
https://stackoverflow.com/a/47849462/29951167
,但是,由于Col4不是数字,因此需要像这样修改: