首页 > 解决方案 > Python pandas 转换对象列中的单个值

问题描述

下面解决了

问题:无法.groupby()排序,因为单个值是string类型对象。Index 5, ColA 10for的值Data In是问题所在。Index 5for ColA, ,的值10是一个字符串对象。pd.to_numeric()如果仅按该列排序,则正确排序该列。

问题:ColA可以转换单个值吗?

方法:

ind = pd.to_numeric(df['ColA'], errors='coerce').fillna(999).astype(int).argsort()
df = df.reindex(ind)
df = df.groupby(df.ColA).apply(pd.DataFrame.sort_values, 'ColB')
df = df.reset_index(drop=True)

数据在:

Index     ColA     ColB     ColC
0         2        14-5     MumboJumbo
1         4        18-2     MumboJumbo2
2         2        24-5     MumboJumbo3
3         3        23-8     MumboJumbo4
4         2        13-6     MumboJumbo5
5         10       86-1     MumboJumbo6
6         10       42-1     MumboJumbo7
7         2        35-6     MumboJumbo8
8         Load     NaN      MumboJumbo9

期望的输出:

Index     ColA     ColB     ColC
0         2        13-6     MumboJumbo5
1         2        14-5     MumboJumbo
2         2        24-5     MumboJumbo3
3         2        35-6     MumboJumbo8
4         3        23-8     MumboJumbo4
5         4        18-2     MumboJumbo2
6         10       42-1     MumboJumbo7
7         10       86-1     MumboJumbo6
8         Load     NaN      MumboJumbo9

谢谢!

标签: pythonpython-3.xpandas

解决方案


我不太了解问题中的问题,但您可以在DataFrame使用iloc(位置索引)或loc(标签索引)中选择特定值。由于您要求替换数据集中第一列第五行中的值,因此我们使用iloc.

df.iloc[from_row:to_row,column_position]

要将第 5 行中的值转换'10'ColAan,int('10')您只需选择它然后更新它。

df.iloc[5:6,0] = 10

如果您不知道需要转换的值的位置,那么ilocloc无济于事。

有几种方法可以将列中的所有值转换为特定的dtype. 一种方法是使用lambda-function。

df[column_name].apply(lambda x: int(x))

以上将lambda中断,因为您的数据还包含字符串Load,并且您无法将其转换为int. 解决此问题的一种方法是向您的lambda.

df[column_name].apply(lambda x: int(x) if something else something)

鉴于您问题中的数据,最直接的方法是检查是否x不是'Load'

df[column_name].apply(lambda x: int(x) if x != 'Load' else x)

如果您的列中有大量实际字符串,这将变得很麻烦。如果您想使用 alambda您可以列出实际字符串。然后检查是否x在列表中。

list_of_strings = ['Load', 'Road', 'Toad']
df[column_name].apply(lambda x: int(x) if x not in list_of_strings else x)

另一种方法是编写一个单独的函数来管理使用 try/catch 块的转换。


推荐阅读