Python Pandas:如何根据基于另一列的条件创建列?

Iam*_*her 2 python dataframe python-3.x pandas

给定以下数据框:

df_test = pd.DataFrame(
    [[1, "BURGLARY"], [2, "PETIT LARCENY"], [3, "DANGEROUS DRUGS"], [4, "LOITERING FOR DRUG PURPOSES"], [5, "DANGEROUS WEAPONS"]],
      columns = ['id','ofns_desc']
)
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我想添加一个新列来简化列中的描述ofns_desc。我做了以下事情:

THEFT = ["BURGLARY", "PETIT LARCENY"]
df_test.loc[df_test.ofns_desc.isin(THEFT), 'category'] = "THEFT"

DRUGS = ["DANGEROUS DRUGS", "LOITERING FOR DRUG PURPOSES"]
df_test.loc[df_test.ofns_desc.isin(DRUGS), 'category'] = "DRUGS"
Run Code Online (Sandbox Code Playgroud)

到目前为止,上面的代码有效:

在此处输入图片说明

但是当我尝试"OTHER"为该category列创建一个值时,该列中的每个值category都会被覆盖:

ALL_CAT = [THEFT, DRUGS]
df_test.loc[~df_test.ofns_desc.isin(ALL_CAT), 'category'] = "OTHER"
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

我究竟做错了什么?

jez*_*ael 5

问题是你测试嵌套列表,所以所有的值都失败了,你需要连接列表+而不是传递给[]喜欢的更改:

ALL_CAT = [THEFT, DRUGS]
Run Code Online (Sandbox Code Playgroud)

到:

ALL_CAT = THEFT + DRUGS
Run Code Online (Sandbox Code Playgroud)

另一个想法是创建字典和Series.map,最后替换缺失值Series.fillna

THEFT = ["BURGLARY", "PETIT LARCENY"]
DRUGS = ["DANGEROUS DRUGS", "LOITERING FOR DRUG PURPOSES"]
d = {"THEFT":THEFT, 'DRUGS':DRUGS}

#swap key values in dict
#http://stackoverflow.com/a/31674731/2901002
d1 = {k: oldk for oldk, oldv in d.items() for k in oldv}
print (d1)
{'BURGLARY': 'THEFT', 'PETIT LARCENY': 'THEFT',
 'DANGEROUS DRUGS': 'DRUGS', 'LOITERING FOR DRUG PURPOSES': 'DRUGS'}

df_test['category'] = df_test['ofns_desc'].map(d1).fillna("OTHER")
print (df_test)
   id                    ofns_desc category
0   1                     BURGLARY    THEFT
1   2                PETIT LARCENY    THEFT
2   3              DANGEROUS DRUGS    DRUGS
3   4  LOITERING FOR DRUG PURPOSES    DRUGS
4   5            DANGEROUS WEAPONS    OTHER
Run Code Online (Sandbox Code Playgroud)