使用python

时间:2016-02-24 18:35:49

标签: python csv pandas

我正致力于构建一个计算d'统计信息,使用CSV文件中的数据,但需要操纵CSV中的数据,以便d'可以计算。 我的问题:我需要使用哪些代码来转换从csv创建的数据框中的数据。

详细说明:

我需要知道有多少项适用于四种类别之一,包括命中,未命中,误报或正确拒绝,其中每个类别都由刺激和检测定义,以便

    点击由" 1"表示刺激发生在同一时间a" 3"检测发生
    小姐由" 1"表示。刺激发生在同一时间a" 4"检测发生
    误报由" 2"表示刺激发生在同一时间a" 3"检测发生
    正确拒绝由" 2"表示刺激发生在同一时间a" 4"检测发生

我正在使用的数据以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的人,我被指示使用pandas来操纵数据。有数据读数,它输出到分类器值,可以告诉我数据框中的某些行是命中,未命中,误报或正确拒绝,但我没有上述数据框,做我想要的。我的代码如下。

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)

我得到的数据框是:

 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

我想要的数据框如下所示:

 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

1 个答案:

答案 0 :(得分:0)

您可以尝试loc来识别列StimDetect以及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