[英]Creating a new column based on if-elif-else condition in python pandas
[英]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.