如何用一些bin大小的值标记pandas行?

时间:2017-03-27 17:38:35

标签: python pandas dataframe label

我有以下pandas DataFrame

import pandas as pd
df = pd.read_csv("file.csv")
df

    column1     column2    column3
0   52767       10         AA
1   52981       15         AA
2   53479       19         BB
3   53891       5071       BB 
4   54012       5891       BB
5   54231       3210       BB
6   54421       12         BB
7   54789       13         CC
8   55011       20         CC
...

我想基于column2的值是否落在某个值内来唯一地标记此DataFrame的每一行。假设column2的值小于或等于19时,我想标记行的所有唯一“束”。我们会将这些标签放在groupings

列中

然后结果数据框将是

    column1     column2    column3    groupings
0   52767       10         AA         1
1   52981       15         AA         1
2   53479       19         BB         1
3   53891       5071       BB         0
4   54012       5891       BB         0
5   54231       3210       BB         0
6   54421       12         BB         2
7   54789       13         CC         2
8   55011       20         CC         0
...

此处有两个唯一的行组,其中column2的值<= 19。在这个例子中,行0,1和2是行的“束”,即连续的行分组,使得column2的值是&lt; = 19。

不知何故,人们也应该能够使用groupby()重复此分析,但考虑到不应该计算column3中类别之间的行数。此数据框看起来像

    column1     column2    column3    groupings
0   52767       10         AA         1
1   52981       15         AA         1
2   53479       19         BB         0   # not a bunch, only one row <= 19 in BB
3   53891       5071       BB         0
4   54012       5891       BB         0
5   54231       3210       BB         0
6   54421       12         BB         0   # not a bunch, only one row <= 19 in BB, not two consecutive
7   54789       13         CC         0
8   55011       20         CC         0
9   55347       5          CC         2   # here there are two rows consecutively <= 19
10  55789       9          CC         2  
...

我完全不知道如何在熊猫中完成这项任务。任何帮助赞赏。

2 个答案:

答案 0 :(得分:3)

好的,这是一个完整的程序:

首先,生成一列标记一堆中的行(如果需要,调整阈值19):

df["groupings"] = pd.cut(df.column2, [-np.inf, 19, np.inf], labels=(1,0))

该列由0和1组成,但你想要0和束数(1,2,3等),所以让我们重新编号:

df.groupings = (df[df.groupings==1].index.to_series().diff() > 1).cumsum() + 1
df['groupings'] = df['groupings'].fillna(0).astype(int) # Remove nans

第一个问题的答案到此结束:

#    column2 column3  groupings
#0        10       A          1
#1        15       A          1
#2        19       B          1
#3      5071       B          0
#4      5891       B          0
#5      3210       B          0
#6        12       B          2
#7        13       C          2
#8        20       C          0
#9         5       C          3
#10        9       C          3

但是,应删除一些标记的行。让我们找出,其中:

bunches = df.groupby('groupings').apply(lambda x:
                                        x['column3'].value_counts() <=1 ).reset_index()
bunches.columns=('groupings','column3','weed')

#   groupings column3   weed
#0          0       B  False
#1          0       C   True
#2          1       A  False
#3          1       B   True
#4          2       C   True
#5          2       B   True
#6          3       C  False

此数据框包含所有行中的所有行,并且还标记“杂草”行。我们需要知道谁是“杂草”:

weeds = bunches[(bunches.weed) & (bunches.groupings > 0)]
#   groupings column3  weed
#3          1       B  True
#4          2       C  True
#5          2       B  True

让我们将这些信息与原始数据框结合起来:

merged = df.merge(weeds, on=['groupings','column3'], how='outer')    
#    column2 column3  groupings  weed
#0        10       A          1   NaN
#1        15       A          1   NaN
#2        19       B          1  True
#3      5071       B          0   NaN
#4      5891       B          0   NaN
#5      3210       B          0   NaN
#6        12       B          2  True
#7        13       C          2  True
#8        20       C          0   NaN
#9         5       C          3   NaN
#10        9       C          3   NaN

请注意,“杂草”行标记为这样!让我们最终将它们标记为属于束:

df.loc[merged[merged.weed==True].index, 'groupings']=0
#    column2 column3  groupings
#0        10       A          1
#1        15       A          1
#2        19       B          0
#3      5071       B          0
#4      5891       B          0
#5      3210       B          0
#6        12       B          0
#7        13       C          0
#8        20       C          0
#9         5       C          3
#10        9       C          3

答案 1 :(得分:0)

[Table("EMPLOYMENT")]
public class Employment : EntityBase
{   
    DateTime? startDate;

    [Column("STARTDATE")]
    public DateTime? StartDate
    {
        get { return this.startDate; }
        set
        {
            this.startDate = value;
            this.StartMonth = value.HasValue ? value.Value.ToString("MMMM") : null;
        }
    }

    [Column("STARTMONTH")]
    public string StartMonth { get; private set; }
}

对于第二部分,我不确定......