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以下的所有行都将使用相同的标签进行标记。你需要一些其他的工具来用序列号重新标记它们。