Python 如何通过某些存储箱大小内的值来标记行?

Python 如何通过某些存储箱大小内的值来标记行?,python,pandas,dataframe,label,Python,Pandas,Dataframe,Label,我有下面的数据框 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

我有下面的数据框

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
的值是否在某个值范围内,唯一地标记此数据帧的每一行。假设当
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
的值为
#创建一个列表来存储数据
分组=[]
#对于列中的每一行,
对于df['column2']中的行:
#如果超过一个值,
如果行<20:
#附加字母等级
groupings.append('1')
其他:
groupings.append('0')
对于第二部分,我不确定…

#创建一个列表来存储数据
分组=[]
#对于列中的每一行,
对于df['column2']中的行:
#如果超过一个值,
如果行<20:
#附加字母等级
groupings.append('1')
其他:
groupings.append('0')

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

好的,这里有一个完整的程序供您使用:

首先,生成一个列来标记一组行(如果需要,调整阈值,
19
):

该列由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
让我们将此信息与原始数据帧结合起来:

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
请注意,“weed”行是这样标记的!最后,让我们将它们取消标记为属于束:

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

好的,这里有一个完整的程序:

首先,生成一个列来标记一组行(如果需要,调整阈值,
19
):

该列由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
让我们将此信息与原始数据帧结合起来:

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
请注意,“weed”行是这样标记的!最后,让我们将它们取消标记为属于束:

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

您的
分组
列没有唯一的值。你所说的“每一行都有唯一的标签”到底是什么意思?至于您的问题的可能解决方案,您可能需要查看
pandas.cut()
@DYZ我所说的“唯一”是指与此条件匹配的行数。第一个示例中的第0行、第1行和第2行都是“一串”行,即连续的行分组,因此第2列的值为,我认为您需要删除单词“unique”,因为它肯定发送了错误的消息。是的,您需要
pandas.cut()
@DYZ,因此,为每行指定
pandas.cut()
的箱子大小,无论
column2
的值是否
正确,如
pd.cut(df.column2,[-np.inf,19,np.inf],labels=(1,0))
。但不幸的是,19以下的所有行都将使用相同的标签进行标记。您需要一些其他工具来使用序列号重新标记它们。您的
分组
列没有唯一的值。你所说的“每一行都有唯一的标签”到底是什么意思?至于您的问题的可能解决方案,您可能需要查看
pandas.cut()
@DYZ我所说的“唯一”是指与此条件匹配的行数。第一个示例中的第0行、第1行和第2行都是“一串”行,即连续的行分组,因此第2列的值为,我认为您需要删除单词“unique”,因为它肯定发送了错误的消息。是的,您需要
pandas.cut()
@DYZ,因此,为每行指定
pandas.cut()
的箱子大小,无论
column2
的值是否
正确,如
pd.cut(df.column2,[-np.inf,19,np.inf],labels=(1,0))
。但不幸的是,19以下的所有行都将使用相同的标签进行标记。你需要一些其他的工具来用序列号重新标记它们。