在 python 中执行对象列操作
Performing object column manipulation in python
我有一个关于 Google Playstore 数据的数据集。它有十二个特征(一个浮点数,其余对象),我想稍微操纵其中一个,以便我可以将它转换为数字形式。我说的特征列是 Size 列,下面是它的外观快照:
如您所见,它是一个字符串形式,由数字和附加的刻度组成。检查该功能的其余部分,我发现除了兆字节 (M) 之外,还有一些以千字节 (K) 为单位的条目以及一些大小为字符串“Varies according to device”的条目。
所以我处理这个问题的最终计划是:
- 从所有小于 size 的条目中删除最后一个字符。
- 将可转换条目转换为浮点数
- 通过将 k 个条目除以 1000 来重新缩放它们以正确表示它们
- 将“因设备而异”条目替换为特征的平均值。
我知道如何做 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']))
)
我有一个关于 Google Playstore 数据的数据集。它有十二个特征(一个浮点数,其余对象),我想稍微操纵其中一个,以便我可以将它转换为数字形式。我说的特征列是 Size 列,下面是它的外观快照:
如您所见,它是一个字符串形式,由数字和附加的刻度组成。检查该功能的其余部分,我发现除了兆字节 (M) 之外,还有一些以千字节 (K) 为单位的条目以及一些大小为字符串“Varies according to device”的条目。
所以我处理这个问题的最终计划是:
- 从所有小于 size 的条目中删除最后一个字符。
- 将可转换条目转换为浮点数
- 通过将 k 个条目除以 1000 来重新缩放它们以正确表示它们
- 将“因设备而异”条目替换为特征的平均值。
我知道如何做 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']))
)