【问题标题】:Performing object column manipulation in python在 python 中执行对象列操作
【发布时间】:2020-10-15 16:29:05
【问题描述】:

我有一个关于 Google Playstore 数据的数据集。它有十二个特征(一个浮点数,其余对象),我想稍微操作其中一个,以便将其转换为数字形式。我说的特征列是 Size 列,下面是它的外观快照:

如您所见,它是一个字符串形式,由数字和附加的比例组成。检查该功能的其余部分,我发现除了兆字节 (M) 之外,还有一些以千字节 (K) 为单位的条目,还有一些大小为字符串“因设备而异”的条目。

所以我处理这个问题的最终计划是:

  1. 从所有小于 size 的条目中去除最后一个字符。
  2. 将可转换条目转换为浮点数
  3. 通过将 k 个条目除以 1000 来重新缩放它们,以便正确表示它们
  4. 将“因设备而异”条目替换为特征的平均值。

我知道如何执行 1,2 和 4,但是 3 给我带来了麻烦,因为我不确定如何区分 k 个条目和 M 个条目并将这些特定条目除以 1000。如果所有这些条目是 M 还是 K,没有问题,因为我之前已经处理过,但是必须进行区分使它变得更加棘手,我不确定语法应该采用什么形式(我的尝试不断抛出错误)。

顺便说一句,如果有人有更聪明的方法来解决这个问题,我很想听听。如果有的话,这是一个学习练习!

任何帮助将不胜感激。谢谢!!

----------------------编辑------------------- -----

尝试的最小可重现示例是

import pandas as pd

data = pd.read_csv("playstore-edited.csv",
                   index_col=("App"),
                   parse_dates=True,
                   infer_datetime_format=True)

x = data

var = [i[-1] for i in x.Size]
sar = dict(list(enumerate(var)))
ls = []
for i in sar:
    if sar[i]=="k":
        ls.append(i)
x.Size.loc[ls,"Size"]=x.Size.loc[ls,"Size"]/1000

这会引发以下错误:

IndexingError: Too many indexers

我知道代码的最后一部分是关闭的,但我不确定如何表达我想要的。

【问题讨论】:

  • 很高兴看到到目前为止您尝试过的最小可复制示例 - 我建议在步骤 1 中将所有条目中的最后一个字符添加到数据框中的新行,然后在步骤 3 中将其用作是否除以 1000 的条件

标签: python pandas machine-learning feature-selection feature-engineering


【解决方案1】:

正如评论中所写:如果您将最后一个字母剥离到一个新列中,则可以对该列进行除法条件。

df = pd.DataFrame({'APP': ['A', 'B'], 'Size': ['5M','6K']})
df['Scale'] = df['Size'].str[-1]
df['Size'] = df['Size'].str[:-1].astype(int)
df.loc[df['Scale'] == 'K', 'Size'] = df.loc[df['Scale'] == 'K', 'Size'] / 1000
df = df.drop('Scale', axis=1)
df

【讨论】:

    【解决方案2】:

    使用正则表达式处理大小列,然后进行转换:

    df = (
        df
        #extract numeric part
        .assign(New_Size = lambda x: x['Size'].str.replace('([A-Za-z]+)', ''))   
        #extract Scale part
        .assign(Scale = lambda x: x['Size'].str.extract('([A-Za-z]+)'))
        #convert KB to MB
        .assign(Size = lambda x: np.where(x['Scale'] =='K', x['New_Size']/1000,x['New_Size']))
        #update converted rows to MB
        .assign(Scale = lambda x: np.where(x['Scale'] =='K', 'M',x['Scale']))
        #replace those do not have value with mean of the size column
        .assign(Size= lambda x: np.where(x['Scale']!='M',mean(x['New_Size']), x['New_Size']))
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-02
      • 1970-01-01
      • 1970-01-01
      • 2017-08-20
      • 2020-10-03
      • 2014-07-15
      • 1970-01-01
      • 2018-11-28
      相关资源
      最近更新 更多