首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python熊猫在对象列中转换单个值

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

Stack Overflow用户
提问于 2018-09-13 15:53:22
回答 1查看 89关注 0票数 1

下面求解

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

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

方法:

代码语言:javascript
复制
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)

数据在:

代码语言:javascript
复制
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

期望输出:

代码语言:javascript
复制
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

谢谢!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-13 16:37:44

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

代码语言:javascript
复制
df.iloc[from_row:to_row,column_position]

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

代码语言:javascript
复制
df.iloc[5:6,0] = 10

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

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

代码语言:javascript
复制
df[column_name].apply(lambda x: int(x))

上面的lambda将中断,因为您的数据还包含字符串Load,并且不能将其转换为int。解决这一问题的一种方法是向lambda添加条件。

代码语言:javascript
复制
df[column_name].apply(lambda x: int(x) if something else something)

考虑到问题中的数据,最简单的方法是检查x是否不是'Load'

代码语言:javascript
复制
df[column_name].apply(lambda x: int(x) if x != 'Load' else x)

如果列中有大量实际字符串,则这将成为一个麻烦。如果要使用lambda,可以列出实际字符串的列表。然后检查x是否在列表中。

代码语言:javascript
复制
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块来管理转换。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52317459

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档