Pandas:将系列添加到数据框作为列(相同的索引,不同的长度)

时间:2013-10-08 22:49:27

标签: python pandas

我在pandas中有以下数据框(下面的df是缩写):

    Index: 23253 entries, 7.0 to 30559.0
    Data columns (total 17 columns):
    Epoch         23190  non-null values
    follow        23253  non-null values
    T_Opp         245    non-null values
    T_Dir         171    non-null values
    Teacher       0      non-null values
    Activity      23253  non-null values
    Actor         23253  non-null values
    Recipient1    14608  non-null values
    dtypes: float64(10), object(7)

T_Opp和T_Dir等列中包含虚拟(1/0)数据。当这些列中的值为true时,我想将“Actor”列中的数据添加到“Teacher”列。到目前为止,我有这个(其中“掩码”给出了数据为真的条件。检查此位并且它有效):

    opp_mask = f_acts['Behavior'].str.contains('bp', na=False)
    opp_teacher = f_acts[opp_mask]['Recipient1']

如果我只根据一列进行此操作,我只需将这些结果插入数据框中的Teacher列,如下所示:

    df['Teacher'] = df[opp_mask]['Actor']

但我需要用其他6列的数据填充Teacher列,而不覆盖之前的列。我知道这可能如何工作,类似于这个玩具示例:

    list = [1]*len(df.Teacher)
    df['Teacher'] = list

但我似乎无法弄清楚如何将上面“掩码”技术的输出转换为这种方法的正确格式 - 它具有相同的索引信息但比我需要添加它的数据帧更短至。我错过了什么?

更新:添加以下数据以阐明我正在尝试做什么。

   follow   T_Opp   T_Dir   T_Enh   T_SocTol    Teacher    Actor    Recipient1
   7        0       1       0       0           NaN        51608    f 
   8        0       0       0       0           NaN        bla      NaN
   11       0       0       0       0           NaN        51601    NaN
   13       1       0       0       1           NaN        f        51602
   18       0       0       0       0           NaN        f        NaN

因此,对于这些数据,我要做的是一次检查一个T_列。如果T_列中的值为true,则从Actor列(如果查看T_Opp或T_SocTol列)或从Recipient列(如果查看T_Enh或T_Dir列)获取数据。我想将该数据复制到当前空的Teacher列中。

一次可以有多个T_列,但在这些情况下,它总是“抓取”相同的数据两次。 (换句话说,我从不需要来自Actor和Recipient列的数据。每行只有一个或另一个。)

我想将该数据复制到当前空的Teacher列中。

1 个答案:

答案 0 :(得分:1)

这是一种使用Series.where()屏蔽和连接多个列的方法。如果最终结果是一列字符串,则需要使用.astype(str)将数字列首先转换为字符串。

In [23]: df
Out[23]: 
        C0  Mask1  Mask2 Val1 Val2
0  R_l0_g0      0      0   v1   v2
1  R_l0_g1      1      0   v1   v2
2  R_l0_g2      0      1   v1   v2
3  R_l0_g3      1      1   v1   v2

In [24]: df['Other'] = (df.Val1.astype(str).where(df.Mask1, '') + ',' + 
                        df.Val2.astype(str).where(df.Mask2, '')).str.strip(',')

In [25]: df
Out[25]: 
        C0  Mask1  Mask2 Val1 Val2  Other
0  R_l0_g0      0      0   v1   v2       
1  R_l0_g1      1      0   v1   v2     v1
2  R_l0_g2      0      1   v1   v2     v2
3  R_l0_g3      1      1   v1   v2  v1,v2

这是使用DataFrame.where()的另一种方法。与大多数pandas操作一样,.where执行自动数据对齐。由于在这种情况下数据框和要屏蔽的帧的列名称不同,因此可以通过使用未标记的原始numpy.ndarray(也称为.values)进行屏蔽来禁用对齐。

In [23]: masked = df[['Val1', 'Val2']].\
                     where(df[['Mask1', 'Mask2']].values, '') + ','

In [24]: df['Other2'] = masked.sum(axis=1).str.strip(',')

In [25]: df
Out[25]: 
        C0  Mask1  Mask2 Val1 Val2  Other Other2
0  R_l0_g0      0      0   v1   v2              
1  R_l0_g1      1      0   v1   v2     v1     v1
2  R_l0_g2      0      1   v1   v2     v2     v2
3  R_l0_g3      1      1   v1   v2  v1,v2  v1,v2