如何根据另一列中满足的条件在dataframe中添加新列?

2024-06-16 08:57:00 发布

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

我的数据框如下所示:

   id   state          level
0   1  [p, t]          [dsd]
1   3  [t, t]    [dsds, dsd]
2   4  [l, l]   [jgddf, vdv]
3   6  [u, c]  [cxxc, jgddf]

我试图做的是检查level列在列表中是否包含部分整个字符串,并在此基础上添加一个新列。这就是我试图实现这一目标的方式(包括如何创建数据帧以及如何对每行中的元素进行排序、过滤和合并):

import numpy as np
import pandas as pd

something = [[1, "p", "dsd"], [3, "t", "dsd"], [6, "u", "jgddf"], [1, "p", "dsd"], [4, "l", "jgddf"], [1, "t", "dsd"], 
             [3, "t", "dsds"], [6, "c", "cxxc"], [1, "p", "dsd"], [4, "l", "vdv"]]

test = pd.DataFrame(something)
test = test.drop_duplicates()
test.columns = ['id', 'state', 'level']
test = test.sort_values(by=['id'], ascending=True)
test_unique = test["id"].unique()

df_aslist = test.groupby(['id']).aggregate(lambda x: list(x)).reset_index()
#making it a set to remove duplicates
df_aslist['level'] = df_aslist['level'].apply(lambda x: list(set(x)))
print(df_aslist)
conditions = [(df_aslist["level"].str.contains("ds") & df_aslist["level"].str.contains("sd")), 
              (df_aslist["level"].str.contains("cx") & df_aslist["level"].str.contains("vd"))]
values = ["term 1", "term 2"]
df_aslist["label"] = np.select(conditions, values)
print(df_aslist)

输出:

   id   state        level label
0   1  [p, t]        [tere]     0
1   3  [t, t]  [dsds, dsd]     0
2   4  [l, l]  [vdv, jgddf]     0
3   6  [u, c]  [cxxc, jgddf]     0

理想情况下,它应该显示以下内容,其中不符合条件的行应该消失,其余的保留新标签

   id   state        level label
1   3  [t, t]  [dsds, dsd]     term 1
2   4  [l, l]  [vdv, jgddf]    term 2
3   6  [u, c]  [cxxc, jgddf]   term 2

Tags: testiddflevelstatevaluestermcontains
1条回答
网友
1楼 · 发布于 2024-06-16 08:57:00

尝试使用astype()方法:

df_aslist[['state','level']]=df_aslist[['state','level']].astype(str)
#the above code change the list inside your columns to string

conditions=[(df_aslist["level"].str.contains("ds") & df_aslist["level"].str.contains("sd")),
            (df_aslist["level"].str.contains("cx") & df_aslist["level"].str.contains("vd"))
           ]

values = ["term 1", "term 2"]

df_aslist["label"] = np.select(conditions, values)

最后筛选出您的数据帧:

df_aslist=df_aslist.query("label!='0'")

如果您打印df_aslist,您将获得所需的输出

注意:如果您想要返回这些列表,请使用pd.eval()

df_aslist[['state','level']]=df_aslist[['state','level']].apply(pd.eval)

相关问题 更多 >