在Python中基于多个条件创建新列

2024-09-22 16:38:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧:

  data = [
(27450, 27450, 29420,"10/10/2016"),
(29420 , 36142, 29420, "10/10/2016"),
(11 , 11, 27450, "10/10/2016")] 

#Create DataFrame base
df = pd.DataFrame(data, columns=("User_id","Actor1","Actor2", "Time"))

第一列包含user_id,每行代表他所做的一个操作。每个用户标识都会显示在“Actor1”或“Actor2”列中。在

首先,我想创建一个新列,如果在“Actor1”列中找到用户_id,它将在其中分配值1,否则为0。在

第二,我想创建一个新的列,在这个列中为每个用户存储与他交互的“Actor”值。在

对于上述示例,输出将如下所示:

^{pr2}$

什么是最有效的Python方法来做到这一点?在

提前谢谢你!在


Tags: columns数据用户iddataframedfdatabase
2条回答

这是我的解决方案-我假设如果userid出现在actor1列中,那么它就不必出现在同一行中。。。在

df["Col1"] = [1 if i in df["Actor1"].values else 0 for i in df["User_id"].values]
df["Col2"] = [df.iloc[i]["Actor2"] if j == 1 else df.iloc[i]["Actor1"] for i, j in enumerate(df["Col1"].values)]

输出-

^{pr2}$
import numpy as np
import pandas as pd

data = [(27450, 27450, 29420,"10/10/2016"),
        (29420 , 36142, 29420, "10/10/2016"),
        (11 , 11, 27450, "10/10/2016")] 
df = pd.DataFrame(data, columns=("User_id","Actor1","Actor2", "Time"))
mask = (df['User_id'] == df['Actor1'])
df['first actor'] = mask.astype(int)
df['other actor'] = np.where(mask, df['Actor2'], df['Actor1'])
print(df)

收益率

^{pr2}$

首先创建一个布尔掩码,当User_id等于Actor1时为真:

In [51]: mask = (df['User_id'] == df['Actor1']); mask
Out[51]: 
0     True
1    False
2     True
dtype: bool

mask转换为int将创建第一列:

In [52]: mask.astype(int)
Out[52]: 
0    1
1    0
2    1
dtype: int64

然后使用np.where在两个值之间进行选择。np.where(mask, A, B)返回一个数组,如果mask[i]为True,则返回其ith值为A[i],否则返回{}。因此, np.where(mask, df['Actor2'], df['Actor1'])Actor2的值,其中mask为真,则取{}中的值,否则:

In [53]: np.where(mask, df['Actor2'], df['Actor1'])
Out[53]: array([29420, 36142, 27450])

相关问题 更多 >