我有一项任务是根据其他Dataframe中的条件创建Dataframe。
我已经用同样的方式做了大约一个星期了,但我很好奇是否有更好的方法。我偶然发现了This Example。现在我知道他正在使用的示例是根据条件创建单独的列,但它让我想知道我的代码是否可以改进。
以下是链接中代码的缩短版本,以便于使用:
import pandas as pd
import numpy as np
raw_data = {'student_name': ['Miller', 'Jacobson', 'Ali', 'Milner', 'Cooze', 'Jacon', 'Ryaner', 'Sone', 'Sloan', 'Piger', 'Riani', 'Ali'],
'test_score': [76, 88, 84, 67, 53, 96, 64, 91, 77, 73, 52, np.NaN]}
df = pd.DataFrame(raw_data, columns = ['student_name', 'test_score'])
print(df)
grades = []
for row in df['test_score']:
if row > 59:
grades.append('Pass')
else:
grades.append('fail')
df['grades'] = grades
print(df)
student_name test_score grades
0 Miller 76.0 Pass
1 Jacobson 88.0 Pass
2 Ali 84.0 Pass
3 Milner 67.0 Pass
4 Cooze 53.0 fail
5 Jacon 96.0 Pass
6 Ryaner 64.0 Pass
7 Sone 91.0 Pass
8 Sloan 77.0 Pass
9 Piger 73.0 Pass
10 Riani 52.0 fail
11 Ali NaN fail
与上面的例子一起,如果我不想制作“等级”列,而是想要通过所有人的数据帧。我个人会这样做:
pass_df = df[df['test_score'] > 59]
print(pass_df)
是否有更好的方法?
答案 0 :(得分:1)
使用np.where
可以更好地分配新列。
df['grades'] = np.where(df.test_score > 59, 'Pass', 'fail')
对于测试分数大于59的索引,您的方法是标准的,但是如果您打算将结果视为自己的DataFrame,则需要调用.copy()
。
<强>演示强>
>>> df['grades'] = np.where(df.test_score > 59, 'Pass', 'fail')
>>> df
student_name test_score grades
0 Miller 76.0 Pass
1 Jacobson 88.0 Pass
2 Ali 84.0 Pass
3 Milner 67.0 Pass
4 Cooze 53.0 fail
5 Jacon 96.0 Pass
6 Ryaner 64.0 Pass
7 Sone 91.0 Pass
8 Sloan 77.0 Pass
9 Piger 73.0 Pass
10 Riani 52.0 fail
11 Ali NaN fail