在 python 中执行对象列操作

Performing object column manipulation in python

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

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

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

  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

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

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

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

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

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']))
)