在下面求解
问题:不能进行.groupby()排序,因为单个值是string类型对象。Index 5,ColA 10用于Data In的值是问题所在。Index 5 for 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期望输出:
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谢谢!
发布于 2018-09-13 16:37:44
我并不真正理解问题中的问题,但是您可以使用DataFrame中的iloc (位置索引)或loc (标签索引)选择特定的值。由于您要求替换数据集中第一列中第五行中的值,因此我们使用iloc。
df.iloc[from_row:to_row,column_position]要将第5行ColA中的值int('10')转换为int('10'),只需选择它,然后更新它。
df.iloc[5:6,0] = 10如果您不知道需要转换的值的位置,那么iloc和loc是没有帮助的。
有几种方法可以将列中的所有值转换为特定的dtype。一种方法是使用lambda-function。
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块来管理转换。
https://stackoverflow.com/questions/52317459
复制相似问题