gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-28 18:46:28 24 4
gpt4 key购买 nike

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

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

如果我只基于一列来做这件事,我可以简单地将这些结果插入数据框中的教师列,如下所示:

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

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

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

最佳答案

这是一种使用 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

关于python - Pandas :将系列作为列添加到数据框中(相同索引,不同长度),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19259909/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com