Python 熊猫转换对象列中的单个值



下面求解

问题:无法.groupby()排序,因为单个值是string类型对象。Index 5的值 ,ColA 10对于Data In是问题所在。ColAIndex 5处的值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

谢谢!

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

df.iloc[from_row:to_row,column_position]

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

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

如果您不知道需要转换的值的位置,那么ilocloc是没有帮助的。

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

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)

如果您的列中有大量实际字符串,这将变得很麻烦。如果你想使用一个lambda你可以列出一个实际字符串。然后检查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 块来管理转换。

最新更新