繁体   English   中英

根据列表中的 if-elif-else 条件创建新列

[英]Creating a new column based on if-elif-else condition from a list

我有一个 pandas dataframe 结构如下:

Id Name
1  ABC
2  DEF
3  GHI
4  JKL

我有一个 ID 列表:

ids = [2,3,4]

我需要在 dataframe 中创建一个新列,如果列表中不存在该 ID,则标记为“不存在”。

所以我需要 dataframe 看起来像这样:

Id Name New_Col
1  ABC  Absent
2  DEF
3  GHI
4  JKL

我试过了

df["new_col"] = ["absent" if df.id in ids else None]

但我得到了错误

TypeError: 'Series' objects are mutable, thus they cannot be hashed

我究竟做错了什么?

您可以将numpy.where.isin()用于此类任务。

import pandas as pd
import numpy as np

ids = [2,3,4]

# sample data
df = pd.DataFrame()
df['Id'] = [1,2,3,4]
df['Name'] = ['ABC','DEF','GHI','JKL']

# selecting Ids in 'ids'
df['new_col'] = np.where(df['Id'].isin(ids),1,0)

您可以使用列的apply方法并传入任意 function 来指示如何从旧列中的每个元素构造新列中的每个元素。

由于这里的逻辑非常简单,我们可以使用 lambda function 在同一行中执行此操作,而不必实际定义 function:

ids = [2, 3, 4]
df = pd.DataFrame({
    'Id': [1, 2, 3, 4],
    'Name': ['ABC', 'DEF', 'GHI', 'JKL'], 
})

df['new_col'] = df['Id'].apply(lambda x: "absent" if x not in ids else None)

print(df)

output:

   Id Name new_col
0   1  ABC  absent
1   2  DEF    None
2   3  GHI    None
3   4  JKL    None

(请注意,我将您的 if 语句修改为if x not in ids ,因为根据预期的输出,这似乎是您想要的)

您可以使用map

ids = [2, 3, 4]
df = pd.DataFrame({
    'Id': [1, 2, 3, 4],
    'Name': ['ABC', 'DEF', 'GHI', 'JKL'], 
})

df['new_col'] = df['Id'].map(lambda x: 'Absent' if x not in ds else None)

Output:

 Id Name new_col
 0   1  ABC  Absent
 1   2  DEF  None
 2   3  GHI  None
 3   4  JKL  None

暂无
暂无

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

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