我有很多列的数据集。 我想通过将他们与' Club'
分组来获取每列的平均值我的数据采用字符串形式,部分数据采用表格形式 ' 60 + 2'或者' 58-1'
我想将此字符串数据类型转换为整数,以便我可以使用它们 计算平均值。
因为我已经搜索过,需要重新跳过' +& - &#39 ;. .str.split用于分割字符串。
在我的情况下,pd.to_numeric将无法正常工作,因为我想立即编辑批量列
complete_dataset is dataframe
cols = [i for i in complete_dataset.columns if i not in ['Name','Club', 'Nationality', 'Age', 'Overall', 'Potential', 'Special']]
for col in cols:
col = complete_dataset[col] #.str.split('+').astype(int)
print(col)
for x in col:
value = x
print(value)
# df[col]=pd.to_numeric(df[col])
这是输出
Name: Acceleration, dtype: object
89
92-4
94
88-6
58+2
79
70+9
76
94
此外,我想将此数据用于进一步的计算
谢谢
答案 0 :(得分:2)
由于您使用了Pandas,我建议使用pandas.eval()
代替Python的eval()
方法,正如Coldspeed正确指出的那样(谢谢!)。
使用pandas.eval()
的优点是它只评估Python表达式而不是Python语句,因此更加安全,与ast.literal_eval()
方法(link to the documentation)相比也应该运行一点有点快。
具体而言,您可以修改代码以执行以下操作:
import pandas
# Your code to read in the DataFrame goes in here.
complete_dataset['Acceleration'] = pandas.eval(complete_dataset['Acceleration'])
这将评估存储在df
中名为Acceleration的列中的所有表达式。该方法应该执行得更快,输出将是整数或浮点数,具体取决于存储在列中的表达式。
有关详细信息,请查看Pandas documentation。
答案 1 :(得分:2)
我想删除符号并按符号添加或减去数字 并将字符串转换为整数。
ast.literal_eval
好吧,这样做的一个好方法是使用python的安全评估 - ast.literal_eval
。
import ast
df.Acceleration = df.Acceleration.apply(ast.literal_eval)
df
Acceleration
0 89
1 88
2 94
3 82
4 60
5 79
6 79
7 76
8 94
df.Acceleration.dtype
dtype('int64')
literal_eval
仅评估某些字符串表达式。假设您有一列包含可以计算的表达式的字符串,这将评估它们并返回数值结果。
请注意,如果您有一个混合整数和字符串列,最简单的方法是将整个列转换为字符串并应用literal_eval
。
df['Acceleration'] = df.Acceleration.astype(str).apply(ast.literal_eval)
pd.eval
/ df.eval
另一个好方法是使用pandas
'安全评估 - pd.Series.eval
,如this answer所述。
df.Acceleration = df.eval(df.Acceleration)
df
Acceleration
0 89
1 88
2 94
3 82
4 60
5 79
6 79
7 76
8 94
如果您的数据包含无效字符串,则需要稍微不同的解决方案,因为上面提到的所有内容都将失败。我们需要定义一个相应处理这些错误的函数。
def parse(x):
try:
return ast.literal_eval(x) # pd.eval(x)
except ValueError:
return np.nan
df.Acceleration = df.Acceleration.apply(parse)
df
Acceleration
0 89
1 88
2 94
3 82
4 60
5 79
6 79
7 76
8 94