下面求解
问题:无法.groupby()
排序,因为单个值是string
类型对象。Index 5
的值 ,ColA 10
对于Data In
是问题所在。ColA
Index 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
如果您不知道需要转换的值的位置,那么iloc
和loc
是没有帮助的。
有几种方法可以将列中的所有值转换为特定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 块来管理转换。