Добавление нового столбца в фрейм данных с использованием существующей переменной - PullRequest
1 голос
/ 08 мая 2019

Я пытаюсь создать новую переменную (столбец) в существующем фрейме данных.

Participant   Session   Trial_number    Accuracy    Block
 G01S01          1             3             1          1
 G01S02          1             4             1          2
 G02S01          1             5             1          5
 G01S01          1             6             1          8
 G01S01          1             7             1          10

По сути, я хочу создать новую переменную "Epoch" на основе столбца Block.Значения блока между 1-4 относятся к эпохе 1, эпохе 2, другим четырем и так далее.Это будет выглядеть примерно так:

Participant   Session   Trial_number    Accuracy    Block    Epoch
 G01S01          1             3             1          1          1
 G01S02          1             4             1          2          1
 G02S01          1             5             1          5          2
 G01S01          1             6             1          8          2
 G01S01          1             7             1          10         3

Кроме того, я также хочу создать другую переменную на основе идентификатора участника, если она заканчивается на 1, то участник принадлежит группе 1, если он заканчивается на 2,участник принадлежит группе 2.


Я пытался решить первую проблему, но в основном не сработало.

import pandas as pd

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

Epoch = []

x = 0

while x < 179424:
    if df['Block'][x] < 5:
        Epoch == 1
    elif 4 < df['Block'][x] < 9:
        Epoch == 2
    elif 8 < df['Block'][x] < 13:
        Epoch == 3
    elif 12 < df['Block'][x] < 17:
        Epoch == 4
    else:
        Epoch == 5
    x += 1

(179424 - количество строк в моей электронной таблице)

Ответы [ 4 ]

2 голосов
/ 08 мая 2019

Вы можете использовать pandas.cut для этого, чтобы создавать ячейки и назначать метки на основе этих корзин:

df['Epoch'] = pd.cut(df['Block'], 
                     [1,4,8,12], 
                     labels=[1,2,3],
                     include_lowest=True)

print(df)
  Participant  Session  Trial_number  Accuracy  Block Epoch
0      G01S01        1             3         1      1     1
1      G01S02        1             4         1      2     1
2      G02S01        1             5         1      5     2
3      G01S01        1             6         1      8     2
4      G01S01        1             7         1     10     3
0 голосов
/ 08 мая 2019

Еще одно очень простое решение:

#Import pandas 
import pandas as pd

# Read csv file
df = pd.read_csv('merge.csv', sep=';')

# Add epoch column
df['Epoch'] = df['Block'] // 4 + 1
# Add group column
df['Group'] = df['Participant'].str[-1]

print(df)
0 голосов
/ 08 мая 2019

Вы можете использовать // для извлечения номера эпохи и apply в столбец «Блок»:

df['Epoch'] = df.apply(lambda x : x['Block']//4 +1)
0 голосов
/ 08 мая 2019

Я думаю, вы хотите использовать метод apply фрейма данных. Этот метод принимает функцию в качестве аргумента и применяет эту функцию к каждой строке кадра данных (или к каждому столбцу, в зависимости от значения axis). Из вашего примера кода я подозреваю, что это была бы значимая функция:

def derive_epoch(row):
    if row['Block'] < 5:
        return 1
    elif row['Block'] < 9:
        return 2
    elif row['Block'] < 13:
        return 3
    elif row['Block'] < 17:
        return 4
    else:
        return 5

Тогда я просто применяю это так:

df['Epoch'] = df.apply(derive_epoch, axis=1)

Надеюсь, это поможет!]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...