按组分组和按组连接值

2024-04-28 17:12:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个熊猫数据框,看起来像这样:

df = pd.DataFrame(data={
'dep': ["NYC", "PAR", "MAD"],
'arr': ["PAR", "SYD", "BCN"],
'ID': ["idx1", "idx1", "idx2"],
'step':[1, 2, 1]})

  dep  arr   ID  step
  NYC  PAR  idx1     1
  PAR  SYD  idx1     2
  MAD  BCN  idx2     1

我想添加一列“itinerary”,它按“ID”(它是“键”)对数据进行分组,并根据step列告知行程,而不聚合行

因此,输出将是:

  dep  arr   ID  step    itinerary
  NYC  PAR  idx1     1  NYC-PAR-SYD
  PAR  SYD  idx1     2  NYC-PAR-SYD
  MAD  BCN  idx2     1      MAD-BCN

我开始尝试使用df.groupby('ID'),然后按step排序,但我还没有弄明白如何根据两个不同行的两列创建值(一行的arr是另一行的dep),如何连接组中所有行的值? 谢谢你的帮助


Tags: 数据iddfsteppdarrnycpar
2条回答

通过groupby()map()agg()join()尝试:

df['itinerary']=  (df['ID'].map(df.groupby('ID')[['dep','arr']]
                 .agg(list)
                 .sum(1)
                 .agg(lambda x:list(set(x))[::-1]).str.join('-')))

df的输出:

    dep     arr     ID      step    itinerary
0   NYC     PAR     idx1    1       NYC-PAR-SYD
1   PAR     SYD     idx1    2       NYC-PAR-SYD
2   MAD     BCN     idx2    1       MAD-BCN

更新:

我不认为这是有效的,但可以做到:

#run the above code first

check=(df['ID'].map(df.groupby('ID')[['dep','arr']]
                 .agg(list)
                 .sum(1)
                 .agg(lambda x:list(x)[::-1]).str.join('-')))

splited=check.str.split('-')

#in this code we don't used set so basically it's for comparision

cond=(splited.str.len().eq(4))  &  (splited.str[0]==splited.str[-1])

最后:

df.loc[cond,'itinerary']=splited.str[-1]+'-'+df.loc[cond,'itinerary']

GroupbyID然后将每个deparr列转换为列表,最后添加它们以获得单个列表,但在添加检查项时,如果给定索引的dep列中已经存在,则可以使用列表理解,最后连接字符串,重命名列,最后将其返回原始数据帧

result = (
            df.merge(df.groupby(['ID'])
            .apply(lambda row: '-'.join(list(row['dep']) + [item for item in row['arr'] if item not in list(row['dep'])] ))
            .reset_index()
            .rename(columns={0:'itinerary'})
                     )
        )

输出

   dep  arr    ID  step    itinerary
0  NYC  PAR  idx1     1  NYC-PAR-SYD
1  PAR  SYD  idx1     2  NYC-PAR-SYD
2  MAD  BCN  idx2     1      MAD-BCN

然后可以更改列名

相关问题 更多 >