首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:在现有列中创建分类变量

Python:在现有列中创建分类变量
EN

Stack Overflow用户
提问于 2017-06-26 05:04:46
回答 3查看 1.5K关注 0票数 2

我在python中有一个DataFrame,它的列包含两个日期的差异。我想在现有列上创建一个新的/覆盖项,该列可以根据以下规则将数字变量转换为分类变量:

代码语言:javascript
复制
difference              0 days    Level 0
difference              2 days    Level 1
difference              2-6 days  Level 2
difference             6-15 days  Level 3
difference             15-69 days Level 4
difference             NAT        Level 5

如何才能做到这一点。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-26 05:26:39

如果列名是“差异”

您可以定义这样的方法

代码语言:javascript
复制
def get_difference_category(difference):
    if difference < 0:
        return 0
    if difference <=2:
        return 1
    #.. and so on

df['difference'] = df['difference'].apply(lambda value: get_difference_category(value), axis=1)

参考链接:wise.ipynb

column.ipynb

票数 2
EN

Stack Overflow用户

发布于 2017-06-26 05:52:48

编辑:要处理NaT,可以使用pd.cut

代码语言:javascript
复制
data['Severity'] = pd.cut((data['End'] - data['Start']).dt.days,[-pd.np.inf,-1,0,2,6,15,69],labels=['Level 5', 'Level 0','Level 1','Level 2','Level 3','Level 4']).fillna('Level 5')

示例:

代码语言:javascript
复制
df.head(10)

       Start        End
0 2017-01-01 2017-01-11
1 2017-01-02 2017-03-09
2 2017-01-03 2017-03-16
3 2017-01-04 2017-01-10
4 2017-01-05 2017-01-25
5 2017-01-06 2017-01-25
6 2017-01-07 2017-01-26
7 2017-01-08 2017-01-15
8 2017-01-09 2017-02-16
9 2017-01-10 2017-01-24


df['Severity'] = pd.cut((df['End'] - df['Start']).dt.days,[-np.inf,0,2,6,15,69,np.inf],labels=['Level 0','Level 1','Level 2','Level 3','Level 4','Level 5'])

输出:

代码语言:javascript
复制
          End      Start Severity
0  2017-01-11 2017-01-01  Level 3
1  2017-03-09 2017-01-02  Level 4
2  2017-03-16 2017-01-03  Level 5
3  2017-01-10 2017-01-04  Level 2
4  2017-01-25 2017-01-05  Level 4
5  2017-01-25 2017-01-06  Level 4
6  2017-01-26 2017-01-07  Level 4
7  2017-01-15 2017-01-08  Level 3
8  2017-02-16 2017-01-09  Level 4
9  2017-01-24 2017-01-10  Level 3
票数 1
EN

Stack Overflow用户

发布于 2020-09-15 12:43:58

我添加了一个条形图来分析分布。我还使用了dataframe和lambda函数来获得我的日差。可视化帮助您理解数据。直方图为您提供了分类分布的洞察力,而配对图则显示了日间隔是如何分布的。

代码语言:javascript
复制
column1=['2017-01-01','2017-01-01','2017-01-02','2017-01-03','2017-01-04','2017-01-05','2017-01-06','2017-01-07','2017-01-08','2017-01-09','2017-01-10']        
column2=['2017-01-01','2017-01-11','2017-03-09','2017-03-16','2017-01-10','2017-01-25','2017-01-25','2017-01-26','2017-01-15','2017-02-16','2017-01-24' ]

index=range(0,len(column1))
data={'column1':column1,'column2':column2}
df=pd.DataFrame(data, columns=['column1','column2'],index=index)
print(df.head())

differences=df.apply(lambda x: datetime.strptime(x['column2'],'%Y-%m-%d')-          datetime.strptime(x['column1'],'%Y-%m-%d'),axis=1)
differences=differences.dt.days.astype('int')
years_bins=[-1,0,2,6,15,69,np.inf]
output_labels=['level 0','level 1','level 2','level 3','level 4','level 5']    

out=pd.cut(differences,bins=years_bins,labels=output_labels)
df['differences']=differences
df['classification']=out

print(df.head())

fig, ax = plt.subplots()
ax = out.value_counts(sort=False).plot.barh(rot=0, color="b", figsize=(6,4))
ax.set_yticklabels(labels)
plt.show()
plt.hist(df['classification'], bins=6)
plt.show()

sns.distplot(df['differences'])
plt.show()
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44753401

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档