【问题标题】:Multiple IF statements for creating another column in pandas用于在 pandas 中创建另一列的多个 IF 语句
【发布时间】: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 函数中

标签: python pandas


【解决方案1】:

我能够创建基于 @Hamms 的解决方案。这是一个可重现的示例:

import pandas as pd
#Create dataframe
column = ['1N', '1N', '1N', '1N', '2N']
data_frame = pd.DataFrame(column, columns = ['column'])

#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: 
        i = names.index(c['column'])
        return str(i + 1)  
#Create index column based on names list    
data_frame['Index'] = data_frame.apply(index, axis = 1)    

#Check result
data_frame[['Index', 'column']]
Out[26]: 
  Index column
0     1     1N
1     1     1N
2     1     1N
3     1     1N
4     3     2N

【讨论】:

    猜你喜欢
    • 2020-03-03
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多