基于条件创建Pandas Dataframe的更好方法

时间:2017-02-23 16:24:58

标签: python pandas dataframe

我有一项任务是根据其他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)

是否有更好的方法?

1 个答案:

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