3

我在 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) 数据。当这些列中的值为真时,我想将“演员”列中的数据添加到“教师”列。到目前为止,我有这个(“掩码”给出了数据为真的条件。检查了这个位并且它有效):

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

如果我只基于一列执行此操作,我可以简单地将这些结果插入到数据框中的教师列中,如下所示:

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

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

    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_ 列中的值为真,则从 Actor 列(如果查看 T_Opp 或 T_SocTol 列)或从 Recipient 列(如果查看 T_Enh 或 T_Dir 列)获取数据。我想将该数据复制到当前为空的教师列中。

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

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

4

1 回答 1

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(). .where与大多数 pandas 操作一样,执行自动数据对齐。由于在这种情况下要屏蔽的数据帧和帧的列名不同,因此可以通过使用未标记的原始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
于 2013-10-10T01:48:41.377 回答