Как назначить элементы в столбец кадра данных Pandas на основе свойств групп, полученных из этого кадра данных? - PullRequest
0 голосов
/ 19 октября 2019

Предположим, я импортирую панд и numpy следующим образом:

import pandas as pd
import numpy as np

и создаю следующий фрейм данных:

df = pd.DataFrame({'Alpha' 
['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : np.NaN})

..., который дает мне это:

    Alpha  Beta
0      A   NaN
1      A   NaN
2      A   NaN
3      B   NaN
4      B   NaN
5      B   NaN
6      B   NaN
7      C   NaN
8      C   NaN
9      C   NaN
10     C   NaN
11     C   NaN

Как мне использовать pandas для получения следующего фрейма данных?

df_u = pd.DataFrame({'Alpha':['A','A','A','B','B','B','B','C','C','C','C','C'],'Beta' : [1,2,3,1,2,2,3,1,2,2,2,3]})

т.е. это:

   Alpha  Beta
0      A     1
1      A     2
2      A     3
3      B     1
4      B     2
5      B     2
6      B     3
7      C     1
8      C     2
9      C     2
10     C     2
11     C     3

Вообще говоря, то, что я пытаюсь достичь, может быть описано следующимлогика:

Предположим, мы сгруппировали df по альфе.

Для каждой группы, для каждой строки в группе ...

  • , если индекс строки равен минимальному индексу строк в группе, тогда присваивают 1бета для этой строки,

  • , в противном случае, если индекс строки равен максимальному индексу строк в группе, тогда присвойте 3 бета для этой строки,

  • иначе присвойте бета 2 этой строке.

Ответы [ 3 ]

0 голосов
/ 19 октября 2019

Давайте использовать дубликаты:

df.loc[~df.duplicated('Alpha', keep='last'), 'Beta'] = 3
df.loc[~df.duplicated('Alpha', keep='first'), 'Beta'] = 1
df['Beta'] = df['Beta'].fillna(2)
print(df)

Вывод:

   Alpha  Beta
0      A   1.0
1      A   2.0
2      A   3.0
3      B   1.0
4      B   2.0
5      B   2.0
6      B   3.0
7      C   1.0
8      C   2.0
9      C   2.0
10     C   2.0
11     C   3.0
0 голосов
/ 19 октября 2019

при условии, что столбец "Альфа" отсортирован, вы можете сделать это следующим образом

df["Beta"] = 2
df.loc[~(df["Alpha"] == df["Alpha"].shift()), "Beta"] = 1
df.loc[~(df["Alpha"] == df["Alpha"].shift(-1)), "Beta"] = 3
df
0 голосов
/ 19 октября 2019

метод 1

Использование np.select:

mask1=df['Alpha'].ne(df['Alpha'].shift())
mask3=df['Alpha'].ne(df['Alpha'].shift(-1))
mask2=~(mask1|mask3)
cond=[mask1,mask2,mask3]
values=[1,2,3]
df['Beta']=np.select(cond,values)
print(df)

   Alpha  Beta
0      A     1
1      A     2
2      A     3
3      B     1
4      B     2
5      B     2
6      B     3
7      C     1
8      C     2
9      C     2
10     C     2
11     C     3

Подробнеесписка условий:

print(mask1)
0      True
1     False
2     False
3      True
4     False
5     False
6     False
7      True
8     False
9     False
10    False
11    False
Name: Alpha, dtype: bool

print(mask2)
0     False
1      True
2     False
3     False
4      True
5      True
6     False
7     False
8      True
9      True
10     True
11    False
Name: Alpha, dtype: bool

print(mask3)
0     False
1     False
2      True
3     False
4     False
5     False
6      True
7     False
8     False
9     False
10    False
11     True
Name: Alpha, dtype: bool

метод 2

Использование groupby:

def assign_value(x):
    return pd.Series([1]+[2]*(len(x)-2)+[3])
new_df=df.groupby('Alpha').apply(assign_value).rename('Beta').reset_index('Alpha') 
print(new_df)

  Alpha  Beta
0     A     1
1     A     2
2     A     3
0     B     1
1     B     2
2     B     2
3     B     3
0     C     1
1     C     2
2     C     2
3     C     2
4     C     3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...