我尝试根据前一列中包含的文本为数据集中的每一行创建新的标签,以下是我的代码
import pandas as pd
import numpy as np
data = pd.read_excel('C:\\Users\\data july 2017.xlsx')
#data['Description'].fillna('')
pawoon = data[data['Description'].str.contains('Pawoon')]
pawoon['time'] = "0"
if pawoon.Description.str.contains('1 Bulan').any():
pawoon['time'] = 1
elif pawoon.Description.str.contains('3 Bulan').any():
pawoon['time'] = 3
elif pawoon.Description.str.contains('6 bulan').any():
pawoon['time'] = 6
elif pawoon.Description.str.contains('1 Tahun').any():
pawoon['time'] = 1
else:
pawoon['time'] = 0
当我打印上面代码的部分结果时,这是我得到的部分结果
Pawoon POS Software (1 Bulan) 1
Software Pawoon (6 bulan) 1
Pawoon POS Software (1 Tahun) 1
Pawoon POS Software (3 Bulan) 1
Pawoon POS Software (1 Bulan) 1
我期望的结果如下所示(基于我在代码中提到的elif else语句)
Pawoon POS Software (1 Bulan) 1
Software Pawoon (6 bulan) 6
Pawoon POS Software (1 Tahun) 12
Pawoon POS Software (3 Bulan) 3
Pawoon POS Software (1 Bulan) 1
为什么会这样?如何获得我想要的结果?
我想.any()
应该更改,但如果我统一更改为.all
每个结果0
答案 0 :(得分:1)
尝试类似
的内容 #Practice data frame
df = pd.DataFrame({'description':list('abc')})
#Initialize the column
df['time'] = -1
#Just one example of how to do this
df.loc[df.description.str.contains('a'),'time'] = 10
结果是
description time
a 10
b -1
c -1
您的问题是您是通过df['time'] = 1
更改整个列。 loc
是实现这一目标的更好方法。
答案 1 :(得分:1)
如果需要多个if else语句,您可以使用numpy.select
:
m1 = pawoon.Description.str.contains('1 Bulan')
m2 = pawoon.Description.str.contains('3 Bulan')
m3 = pawoon.Description.str.contains('6 Bulan')
m4 = pawoon.Description.str.contains('1 Tahun')
pawoon['time'] = np.select([m1,m2,m3,m4], [1,3,6,12], default=0)
print (pawoon)
Description time
0 Pawoon POS Software (1 Bulan) 1
1 Software Pawoon (6 Bulan) 6
2 Pawoon POS Software (1 Tahun) 12
3 Pawoon POS Software (3 Bulan) 3
4 Pawoon POS Software (1 Bulan) 1