【发布时间】:2017-05-20 01:37:58
【问题描述】:
我正在使用 pandas 有条件地创建另一列,但我的数据集中大约有 103 个条件需要循环遍历。 有没有一种方法可以创建 if-elif-else 语句,而我不必创建这么多语句?
我的范围有两种类型的字符串,其分类名称以 N 或 S 结尾,范围从 1 到 53。例外是 3、7、14、17、53 和 54。
我启动了 if-elif-else,但我还会有大约 100 个 elif 语句。例如,如果类别为 1N,那么我将在 Index 列中创建一行显示 1。
我的数据:
data_frame['column'].head(5)
Out[2]:
0 1N
1 1N
2 1N
3 1N
4 2N
Name: column, dtype: object
声明:
#loop
def index(c):
if c['column'] == '1N':
return 1
elif c['column'] == '1S':
return 2
elif c['column'] == '2N':
return 3
else:
return 'Undefined'
data_Frame['Index'] = data_frame.apply(index, axis = 1)
检查结果:
data_frame[['column', 'Index']].head(5)
Out[7]:
Column Index
0 1N 1
1 1N 1
2 1N 1
3 1N 1
4 2N 3
试用 1: 我得到一个浮点数,但是是十进制格式和错误的索引。它从 0 而不是 1 开始。
#Create list
names = ["1N", "1S", "2N", "2S", "3", "4N", "4S", "5N", "5S", "6N", "6S", "7"]
#Create function
def index(c):
if c['column'] in names:
return names.index(c['column'])
#Apply index to data
data_frame['Index'] = old_info.apply(index, axis = 1)
#results
data_frame['Index'].head(5)
Out[7]:
0 0.0
1 0.0
2 0.0
3 0.0
4 2.0
Name: Index, dtype: float64
【问题讨论】:
-
您想要每个分类名称的唯一索引吗?如果是这样,您可以将它们全部放在一个列表中,例如
names = ["1N", "1S", "2N", ...]然后return names.index(c['column']) -
是的,每个分类名称都会获得唯一的索引。但是,每个分类值在数据集中都有不同的计数,并非所有分类值都位于我的数据集中。我能够运行它,但由于无法找到某些值而出现错误。如果找不到,有没有办法让“返回”跳过? ValueError: ("'27' is not in list", '发生在索引 93')
-
if c['column'] in names: return names.index(c['column']) -
简单转换一下;
i = names.index(c['column']); return str(i + 1) -
您不需要为此创建另一个函数;只需将该部分放入您现有的
index函数中