【问题标题】:classifying a series to a new column in pandas将系列分类到熊猫中的新列
【发布时间】:2013-02-23 05:59:00
【问题描述】:

我希望能够获取我当前用整数填充的数据集,并根据某些标准对它们进行分类。该表如下所示:

[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 和 lambdas ,它们都导致类型错误(在 ints 和 series 之间)。我的印象是这是一个相当简单的问题。虽然以下是完全错误的,但这是尝试 1 的逻辑:

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"

如果有人可以帮助我解决这个问题,将不胜感激。

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    我可以想到两种方法。首先是写一个分类器函数,然后.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
    

    哪个更清楚取决于情况。通常,逻辑越复杂,我就越有可能将其封装在一个函数中,然后我可以记录和测试。

    【讨论】:

      猜你喜欢
      • 2018-12-02
      • 2016-08-30
      • 2015-04-14
      • 1970-01-01
      • 2020-06-03
      • 2014-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多