2017-12-19 14 views
1

私は、2-backedテストという名前のコグニティブタスクを作成しようとしています。文字列でデータフレームを反復する

私は一定の条件でセミランダムなリストを作成しましたが、今私は参加者のために何が良い答えであるべきかを知りたかったのです。

データフレーム内の列に、「はい」または「いいえ」と入力すると、2文字前に同じ文字が表示されます。ここで

は私のコードです:

from random import choice, shuffle 
import pandas as pd 

num = 60 

letters = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L'] 

# letters_1 = [1, 2, 3, 4, 5, 6] 

my_list = [choice(letters), choice(letters)] 
probab = list(range(num - 2)) 
shuffle(probab) 

# We want 20% of the letters to repeat the letter 2 letters back 
pourc = 20 
repeatnum = num * pourc // 100 
for i in probab: 
    ch = prev = my_list[-2] 
    if i >= repeatnum: 
     while ch == prev: 
      ch = choice(letters) 
    my_list.append(ch) 

df = pd.DataFrame(my_list, columns=["letters"]) 
df.head(10) 
    letters 
0  F 
1  I 
2  D 
3  I 
4  H 
5  C 
6  L 
7  G 
8  D 
9  L 
# Create a list to store the data 
response = [] 

# For each row in the column, 
for i in df['letters']: 
    # if more than a value, 
    if i == [i - 2]: 
     response.append('yes') 
    else: 
     response.append('no') 

# Create a column from the list 
df['response'] = response 

まずエラー:

if i == [i - 2]: 
TypeError: unsupported operand type(s) for -: 'str' and 'int' 

私は数字の代わりに文字を使用している場合は、私はこのエラーを乗り越えることができますしかし、私は

しかし、それ以降は数字で実行するとエラーは発生しませんが、新しい列応答には「いいえ」しかありません。しかし、私はそれが「はい」でなければならないことを12回知っています。

答えて

1

2つの要素でシフトされた列と同じ列の比較を実行したいようです。

df['response'] = np.where(df.letters.eq(df.letters.shift(2)), 'yes', 'no') 
df.head(10) 

    letters response 
0  F  no 
1  I  no 
2  D  no 
3  I  yes 
4  H  no 
5  C  no 
6  L  no 
7  G  no 
8  D  no 
9  L  no 

しかし、私は12回は、それが 'はい' でなければならないことを知っている - shift + np.where使用してください。

df.response.eq('yes').sum() 
12 
関連する問題