2017-02-23 122 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