繁体   English   中英

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

[英]Pandas: Add series to dataframe as a column (same index, different length)

我在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列中。

这是使用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 (aka .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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM