Python Pandas在对象列中转换单个值

时间:2018-09-13 15:53:22

标签: python python-3.x pandas

解决以下问题

问题:无法进行.groupby()排序,因为单个值是string类型的对象。问题是Index 5的{​​{1}},ColA 10处的值。 Data In Index 5ColA处的值是一个字符串对象。如果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

谢谢!

1 个答案:

答案 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

如果您不知道需要转换的值的位置,那么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块管理转换。