【问题标题】:want to group categorical values in a column想要在一列中对分类值进行分组
【发布时间】:2018-11-27 14:41:39
【问题描述】:

我正在尝试将数值分组并分配给具有以下值的“邻居”列:#Queens#Jackson Heights#、#Manhattan#Upper East Side#Sutton Place#、#Brooklyn#Williamsburg#、#Bronx#东布朗克斯#Throgs Neck#。 (值有 2,3 有时有 4,5 个标签) 我使用了正常的 if else 循环,它对前 3 个值运行良好,如附图所示。 但我不确定它是否工作正常。请帮我对这些组进行分组和赋值。 [我使用的 if else 循环如下: *

*# Create a list to store the data
grades = []
# For each row in the column,
for row in new_train1['neighborhood']:
    # if more than a value,
    if row > '#Queens#':
        # Append a num grade
        grades.append('1')
    # else, if more than a value,
    elif row > '#Manhattan#':
        # Append a letter grade
        grades.append('2')
    # else, if more than a value,
    elif row > '#Bronx#':
        # Append a letter grade
        grades.append('3')
    # else, if more than a value,
    elif row > '#Brooklyn#':
        # Append a letter grade
        grades.append('4')
    # else, if more than a value,
    else:
        # Append a failing grade
        grades.append('0')

] [1]:https://i.stack.imgur.com/iQ3E8.png

【问题讨论】:

  • 您的问题不清楚。你的输入和预期输出是什么?请提供minimal reproducible example
  • 进一步,你所说的行是什么意思>'#Manhattan'?不知道你怎么能这样调节。
  • 您想为皇后区、曼哈顿区、布朗克斯区和布鲁克林区的集合分配一个代码?他们能保证永远是第一吗?
  • @Rucha:如果我理解正确,首先你必须将str 拆分为#
  • @Kyle 是的,值总是显示为给定的.. #Queens,#Manhattan..,#Bronx.. 此外,输入是具有上述值的列邻域,我想分配数值(例如,所有以#Queens 开头的区域都应具有值“1”,所有以#Manhattan.. 开头的区域都应具有“2”,#Bronx..= 4)

标签: python-3.x pandas group-by scikit-learn one-hot-encoding


【解决方案1】:

请避免粘贴图片和测试打字技巧。如果我正确理解你的问题,我会做这样的事情

#creating data frame
df = pd.DataFrame({"A":[1,2,3,4,5], "B":["#Queens#Jackson Heights#", "Manhattan#Upper East Side#Sutton Place#", "Bronx#West East Side#", "Manhattan#Upper East Side#", "#Manhattan#Downtown#Chelsea"]})
#creating replacement dictionary
replace_dic = {"Queens":1, "Jackson Heights":2, "Manhattan":3, "Upper East Side":4, "Sutton Place":5,
              "Bronx":6, "West East Side":7, "Downtown":8, 'Chelsea':9}
#replacing
df['C'] = df['B'].str.split("#").apply(lambda x: [replace_dic[i] for i in x if i != ''])
#result
    A   B   C
0   1   #Queens#Jackson Heights#    [1, 2]
1   2   Manhattan#Upper East Side#Sutton Place#     [3, 4, 5]
2   3   Bronx#West East Side#   [6, 7]
3   4   Manhattan#Upper East Side#  [3, 4]
4   5   #Manhattan#Downtown#Chelsea     [3, 8, 9]

根据您的 cmets,我认为您正在寻找类似的东西

def replacefunc(x):
    x = [i for i in x if i != '']
    return replace_dic[x[0]]
df['D'] = df['B'].str.split("#").apply(replacefunc)

【讨论】:

  • 非常感谢。了解如何创建字典。
  • 视情况而定!如果您有这么多值并且可以分配任何随机整数,则只需迭代列的唯一值
  • 当然。非常感谢@ramesh
  • 您能否帮助解决我发布的关于同一问题的另一个问题?问题主题:错误:IndexError:列表索引超出范围
  • 我很难搜索到您的问题。在此处分享链接。也许他们是在这里帮助你的其他人。
【解决方案2】:

感谢大家的帮助和投入。我通过简单的拆分删除了主题标签。 & 然后使用 for 循环来计算每行中的第一个单词。 它给了我预期的输出但index out of range error,但我正在努力。代码如下:

train = pd.DataFrame(train, columns = ['id','listing_type','floor','latitude','longitude','price','beds','baths','total_rooms','square_feet','pet_details','neighborhood'])
    # Create a list to store the data
    grades = []

    # For each row in the column,
    for row in train['neighborhood'].str.split('#'):
        # if more than a value,
        if row[1] == 'Queens':
            # Append a num grade
            grades.append('1')
        # else, if more than a value,
        elif row[1] == 'Manhattan':
            # Append a letter grade
            grades.append('2')
        # else, if more than a value,
        elif row[1] == 'Bronx':
            # Append a letter grade
            grades.append('3')
        # else, if more than a value,
        elif row[1] == 'Brooklyn':
            # Append a letter grade
            grades.append('4')
        # else, if more than a value,
        else:
            # Append a failing grade
            grades.append('0')

`

【讨论】:

    猜你喜欢
    • 2023-04-07
    • 2017-11-20
    • 2019-05-02
    • 2019-10-11
    • 2019-02-25
    • 2019-04-04
    • 1970-01-01
    • 1970-01-01
    • 2013-05-27
    相关资源
    最近更新 更多