我有以下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
...
我完全不知道如何在熊猫中完成这项任务。任何帮助赞赏。
答案 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; }
}
对于第二部分,我不确定......