Python 如何基于另一列添加到熊猫列

Python 如何基于另一列添加到熊猫列,python,pandas,dataframe,Python,Pandas,Dataframe,目前我有一张这样的桌子 ID Previous_Injuries Currently_Injured Injury_Type 1 Nan 0 Nan 1 Nan 1 Ankle 1 Nan 0

目前我有一张这样的桌子

ID       Previous_Injuries    Currently_Injured      Injury_Type
1            Nan                      0                  Nan
1            Nan                      1                  Ankle
1            Nan                      0                  Nan
1            Nan                      1                  Wrist
1            Nan                      0                  Nan
1            Nan                      1                  Leg
1            Nan                      0                  Nan
2            Nan                      1                  Leg
2            Nan                      0                  Nan
我想添加到前面的“受伤”列中,并使我的表如下所示:

ID       Previous_Injuries    Currently_Injured      Injury_Type
1            Nan                      0                  Nan
1            Nan                      1                  Ankle
1            [Ankle]                  0                  Nan
1            [Ankle]                  1                  Wrist
1            [Ankle,Wrist]            0                  Nan
1            [Ankle,Wrist]            1                  Leg
1            [Ankle,Wrist,Leg]        0                  Nan
2            Nan                      1                  Leg
2            [Leg]                    0                  Nan

我怎样才能在熊猫中获得这样的专栏呢?最好是以列表的形式来做吗

谢谢

我们可以使用cumsum进行移位,然后拆分字符串,注意这里使用的是Nanstring类型,它不是np.nan

再换一次问题

l=[]
for name , dfx in df.groupby('ID'):
    s = dfx.Injury_Type.shift().fillna('Nan').add(',').cumsum().str[:-1].str.split(',')
    dfx['new'] = [[y for y in x if y != 'Nan'] for x in s]
    l.append(dfx)

pd.concat(l)
我们可以使用cumsum进行移位,然后拆分字符串,注意这里使用的是Nanstring类型,它不是np.nan

再换一次问题

l=[]
for name , dfx in df.groupby('ID'):
    s = dfx.Injury_Type.shift().fillna('Nan').add(',').cumsum().str[:-1].str.split(',')
    dfx['new'] = [[y for y in x if y != 'Nan'] for x in s]
    l.append(dfx)

pd.concat(l)
使用:

替换“Nan”,如果Nan不是str,则可以省略np.Nan

用于不同的ID

df['Previous_Injuries']=( df.groupby('ID')['Injury_Type']
                            .apply(lambda x: x.replace('Nan',np.nan).fillna(' ')
                                              .cumsum().shift(fill_value='')
                                              .str.split()) )
print(df)
使用:

替换“Nan”,如果Nan不是str,则可以省略np.Nan

用于不同的ID

df['Previous_Injuries']=( df.groupby('ID')['Injury_Type']
                            .apply(lambda x: x.replace('Nan',np.nan).fillna(' ')
                                              .cumsum().shift(fill_value='')
                                              .str.split()) )
print(df)

通常,在数据帧中存储列表或其他对象效率低下,并使其他操作更加复杂。虽然有时候如果你的数据不是很大的话也可以。之后您需要如何处理这些信息?通常在数据帧中存储列表或其他对象效率很低,并且使其他操作更加复杂。虽然有时候如果你的数据不是很大的话也可以。之后你需要如何处理这些信息?很好,但为什么不只是:df['Injury_Type']。替换'Nan','''.cumsum.shift.str.split.bfill?谢谢,对帖子进行了编辑以包含不同的ID。在这种情况下,代码会改变吗?你是对的,replace的双重使用是因为我不知道OP是否有Nan或np.Nan值@Anton vBRusing np.Nan@ansevI为differents ID@soccer\u analytics\u fanGood添加了一个解决方案,但为什么不只是:df['Injury\u Type']。replace'Nan',''.cumsum.shift.str.split.bfill?谢谢,对帖子进行编辑以包含不同的ID。在这种情况下,代码会发生变化吗?你是对的,替换的双重使用是因为我不知道OP是否有Nan或np.Nan值@Anton vBRusing np.Nan@ansevI为differents ID@soccer\u analytics\u FanThank添加了一个解决方案,对帖子进行了编辑以包含不同的ID。在这种情况下,代码会改变吗?@soccer\u analytics\u fan groupby do it每个小组然后Concathanks对帖子进行了编辑,以包含不同的ID。在这种情况下,代码会发生变化吗?@soccer\u analytics\u fan groupby每个小组都这样做,然后concat
df['Previous_Injuries']=( df.groupby('ID')['Injury_Type']
                            .apply(lambda x: x.replace('Nan',np.nan).fillna(' ')
                                              .cumsum().shift(fill_value='')
                                              .str.split()) )
print(df)
   ID    Previous_Injuries  Currently_Injured Injury_Type
0   1                   []                  0         Nan
1   1                   []                  1       Ankle
2   1              [Ankle]                  0         Nan
3   1              [Ankle]                  1       Wrist
4   1       [Ankle, Wrist]                  0         Nan
5   1       [Ankle, Wrist]                  1         Leg
6   1  [Ankle, Wrist, Leg]                  0         Nan
7   2                   []                  1         Leg
8   2                [Leg]                  0         Nan