解决以下问题
问题:无法进行.groupby()
排序,因为单个值是string
类型的对象。问题是Index 5
的{{1}},ColA 10
处的值。 Data In
Index 5
在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
谢谢!
答案 0 :(得分:0)
我不太了解问题所在,但是您可以使用DataFrame
(位置索引)或iloc
(标签索引)在loc
中选择特定值。由于您要替换数据集中第一列第五行中的值,因此我们使用iloc
。
df.iloc[from_row:to_row,column_position]
要将第5行'10'
中的值ColA
转换为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块管理转换。