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