การแปลงและการสร้างคอลัมน์ใน data frame โดยใช้ python

ฉันกำลังสร้างสคริปต์หลามที่คำนวณสถิติ d' โดยใช้ข้อมูลจากไฟล์ CSV แต่ข้อมูลใน CSV จำเป็นต้องได้รับการจัดการเพื่อให้สามารถคำนวณ d' ได้ คำถามของฉัน: ฉันต้องใช้โค้ดใดในการแปลงข้อมูลใน data frame ที่สร้างจาก csv

รายละเอียด:

ฉันจำเป็นต้องรู้ว่ามีกี่รายการที่เกี่ยวข้องกับหนึ่งในสี่หมวดหมู่ ไม่ว่าจะเป็นการตี พลาด การเตือนที่ผิดพลาด หรือการปฏิเสธที่ถูกต้อง โดยแต่ละหมวดหมู่ถูกกำหนดโดยการกระตุ้นและการตรวจจับ เช่น

    Hit is signified by a "1" stimulation happening at the same time a "3" detection happens
    Miss is signified by "1" stimulation happening at the same time a "4" detection happens
    False Alarm is signified by "2" stimulation happening at the same time a "3" detection happens
    Correct Rejection is signified by "2" stimulation happening at the same time a "4" detection happens

ข้อมูลที่ฉันกำลังดำเนินการมาหาฉันในรูปแบบ CSV ซึ่งแสดงรายการลำดับการกระตุ้นและการตรวจจับเกิดขึ้นในคอลัมน์เดียว โดยเมื่อมีการประกาศการกระตุ้น ระบบจะนำไปใช้กับการตรวจจับที่ตามมาจนกว่าจะมีการเรียกการกระตุ้นใหม่ ดูเหมือนว่านี้:

 Identifier
0         1
1         3
2         4
3         3
4         2
5         4
6         3
7         3

ฉันต้องการกรอบข้อมูลที่มีลักษณะดังนี้:

 Stim Detect
0   1      3
1   1      4
2   1      3
3   2      4
4   2      3
5   2      3

ตอนนี้ฉันอยู่ที่ไหน

เมื่อมองไปรอบๆ ที่นี่ และจากการถามคนไม่กี่คนที่ฉันรู้ว่าใครรู้จัก Python เป็นอย่างดี ฉันถูกสั่งให้ใช้แพนด้าเพื่อจัดการข้อมูล มีการอ่านข้อมูลและส่งออกไปยังค่าลักษณนามซึ่งสามารถบอกฉันได้ว่าบางแถวในกรอบข้อมูลเป็นการเข้าชม พลาด สัญญาณเตือนที่ผิดพลาด หรือการปฏิเสธที่ถูกต้อง แต่ฉันไม่มีกรอบข้อมูลที่อธิบายข้างต้นที่ทำ ฉันต้องการ. รหัสของฉันอยู่ด้านล่าง

import pandas as pd

df = pd.read_csv('file1.csv')

def stim(row):
    if row['Identifier'] == 1:
        return 1
    elif row['Identifier'] == 2:
        return 2

def detect(row):
    if row['Identifier'] == 3:
        return 3
    elif row['Identifier'] == 4:
        return 4

def classifier(row):
    return row['Stim']+row['Detect']

df['Stim']   = df.apply(stim,axis=1)
df['Detect'] = df.apply(detect,axis=1)
df['Classifier'] = df.apply(classifier,axis=1)

data frame ที่ฉันได้รับคือ:

 Identifier Stim Detect Classifier
0         1    1    NaN        NaN
1         3  NaN      3        NaN
2         4  NaN      4        NaN
3         3  NaN      3        NaN
4         2    2    NaN        NaN
5         4  NaN      4        NaN

และ data frame ที่ฉันต้องการจะเป็นดังนี้:

 Identifier Stim Detect Classifier
0         1    1    NaN        NaN
1         3    1      3          4
2         4    1      4          5
3         3    1      3          4
4         2    2    NaN        NaN
5         4    2      4          6

person Christopher Friedman    schedule 24.02.2016    source แหล่งที่มา
comment
คุณหมายความว่าอย่างไรคุณไม่มี data frame ด้านบนที่ทำสิ่งที่คุณต้องการ? ผลลัพธ์ที่คุณได้รับคืออะไร และแตกต่างจากที่คุณต้องการอย่างไร   -  person BrenBarn    schedule 24.02.2016
comment
@BrenBarn แก้ไขเพื่อตอบคำถามของคุณ   -  person Christopher Friedman    schedule 24.02.2016


คำตอบ (1)


คุณสามารถลอง loc เพื่อระบุค่าในคอลัมน์ Stim และ Detect และ fillna สำหรับการเติมค่าที่ขาดหายไป ในคอลัมน์ Stim:

print df
   Identifier
0           1
1           3
2           4
3           3
4           2
5           4
6           3
7           3

df.loc[df['Identifier'] == 1, 'Stim'] = 1
df.loc[df['Identifier'] == 2, 'Stim'] = 2

df.loc[df['Identifier'] == 3, 'Detect'] = 3
df.loc[df['Identifier'] == 4, 'Detect'] = 4

#fill NaN by method ffill (propagate last valid observation forward to next valid)
df['Stim'] = df['Stim'].fillna(method='ffill')

df['Classifier'] = df['Stim'] + df['Detect']

print df
   Identifier  Stim  Detect  Classifier
0           1     1     NaN         NaN
1           3     1       3           4
2           4     1       4           5
3           3     1       3           4
4           2     2     NaN         NaN
5           4     2       4           6
6           3     2       3           5
7           3     2       3           5
person jezrael    schedule 24.02.2016