Pandas 如何使用dataframe跨多个列按Id分组

Pandas 如何使用dataframe跨多个列按Id分组,pandas,dataframe,concatenation,Pandas,Dataframe,Concatenation,我有df中的数据帧列表 dataframe 1: ID Name Coupon Description Coupon_Type 100 FXC 2.5 Foo Foo Fixed 100 FXC 1.5 Foo Foo Floating 200 MNY 1.0 Man Man Fixed 300 ABC 2.5 Arm T Fixed 300 ABC 3.0 Arm M Fixed 300 ABC

我有df中的数据帧列表

dataframe 1:
ID  Name Coupon Description Coupon_Type
100 FXC    2.5  Foo Foo     Fixed
100 FXC    1.5  Foo Foo     Floating
200 MNY    1.0  Man Man     Fixed
300 ABC    2.5  Arm T        Fixed
300 ABC    3.0  Arm M        Fixed
300 ABC    2.5  Arm T        Fixed

dataframe2:
ID  Name Index_Linked
100 FXC  Y
300 ABC  N

试图得到这样的结果数据帧

ID  Name Coupon        Description    Coupon_Type      Index_Linked
100 FXC [2.5,1.5]      Foo Foo        [Fixed, Floating]  Y
200 MNY 1.0            Man Man        Fixed
300 ABC [2.5,3.0]      [Arm T, Arm M] Fixed              N

如果我尝试


df_final=pd.concat(df, ignore_index=True)

我明白了

非常感谢您的建议。

让我们试试

out = df1.groupby(['ID','Name']).agg(lambda x : set(x)).reset_index().merge(df2,how='left')
Out[86]: 
    ID Name      Coupon   Description        Coupon_Type Index_Linked
0  100  FXC  {1.5, 2.5}      {FooFoo}  {Floating, Fixed}            Y
1  200  MNY       {1.0}      {ManMan}            {Fixed}          NaN
2  300  ABC  {2.5, 3.0}  {ArmT, ArmM}            {Fixed}            N

您可以通过
groupby()
方法、
agg()
方法和
merge()
方法执行此操作:

resultdf=df1.groupby(['ID','Name'],as_index=False).agg(lambda x : list(set(x))[0] if len(list(set(x)))==1 else list(set(x))).merge(df2,how='left')
现在,如果您打印
resultdf
,您将获得所需的输出:

    ID      Name    Coupon      Description     Coupon_Type         Index_Linked
0   100     FXC     [1.5, 2.5]  Foo Foo         [Fixed, Floating]       Y
1   200     MNY     1.0         Man Man         Fixed                   NaN
2   300     ABC     [2.5, 3.0]  [Arm T, Arm M]  Fixed                   N
    ID      Name    Coupon      Description     Coupon_Type         Index_Linked
0   100     FXC     [1.5, 2.5]  Foo Foo         [Fixed, Floating]       Y
1   200     MNY     1.0         Man Man         Fixed                   NaN
2   300     ABC     [2.5, 3.0]  [Arm T, Arm M]  Fixed                   N