在pandas中将系列分类到新列

8 投票
1 回答
8992 浏览
提问于 2025-04-17 18:19

我想把我现在的数据(里面全是整数)按照某些标准进行分类。这个表格大概是这样的:

[in]> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]})
[out]>
   A  B  C
0  0  1  0
1  2  0  0
2  3  2  1
3  2  0  0
4  0  0  1
5  0  0  0

我想在一个单独的列里用字符串来分类这些数据。因为我对R语言比较熟悉,所以我试着在这个新列的定义里写规则。接着我又尝试使用.ix和lambda函数,但都出现了类型错误(整数和序列之间的错误)。我觉得这个问题应该挺简单的。虽然下面的逻辑完全错误,但这是我第一次尝试的思路:

df['D']=(
if ((df['A'] > 0) & (df['B'] == 0) & df['C']==0): 
    return "c1";
elif ((df['A'] == 0) & ((df['B'] > 0) | df['C'] >0)): 
    return "c2";
else:
    return "c3";)

最后的结果应该是:

   A  B  C     D
0  0  1  0  "c2"
1  2  0  0  "c1"
2  3  2  1  "c3"
3  2  0  0  "c1"
4  0  0  1  "c2"
5  0  0  0  "c3"

如果有人能帮我解决这个问题,我会非常感激。

1 个回答

15

我能想到两种方法。第一种是写一个分类函数,然后用 .apply 按行来应用这个函数:

>>> import pandas as pd
>>> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]})
>>> 
>>> def classifier(row):
...         if row["A"] > 0 and row["B"] == 0 and row["C"] == 0:
...                 return "c1"
...         elif row["A"] == 0 and (row["B"] > 0 or row["C"] > 0):
...                 return "c2"
...         else:
...                 return "c3"
...     
>>> df["D"] = df.apply(classifier, axis=1)
>>> df
   A  B  C   D
0  0  1  0  c2
1  2  0  0  c1
2  3  2  1  c3
3  2  0  0  c1
4  0  0  1  c2
5  0  0  0  c3

第二种方法是使用高级索引:

>>> df = pd.DataFrame({'A':[0,2,3,2,0,0],'B': [1,0,2,0,0,0],'C': [0,0,1,0,1,0]})
>>> df["D"] = "c3"
>>> df["D"][(df["A"] > 0) & (df["B"] == 0) & (df["C"] == 0)] = "c1"
>>> df["D"][(df["A"] == 0) & ((df["B"] > 0) | (df["C"] > 0))] = "c2"
>>> df
   A  B  C   D
0  0  1  0  c2
1  2  0  0  c1
2  3  2  1  c3
3  2  0  0  c1
4  0  0  1  c2
5  0  0  0  c3

哪种方法更清晰取决于具体情况。通常来说,逻辑越复杂,我就越倾向于把它封装成一个函数,这样我可以对它进行文档说明和测试。

撰写回答