2017-02-23 116 views
2

我有一项任务是根据其他数据框内的条件创建数据框。根据条件创建熊猫数据框的更好方法

我一直这样做了大约一周的时间,但我很好奇,如果有更好的方法。我偶然发现了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

使用np.where可以更好地分配新列。

df['grades'] = np.where(df.test_score > 59, 'Pass', 'fail') 

至于索引,其中测试得分大于59你的方法是标准的,但是你要打算对治疗结果作为自己的数据帧,你会想打电话给.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 
+0

我没有看到它了,但你的使用.copy()的点是非常有帮助。感谢您为我清除这个 – MattR

+0

@MattR是的,我并不觉得这是明确的必要,但我有这种感觉,你可能试图修改结果......很高兴我能帮上忙! – miradulo