Python Pandas: проверьте значение столбца по нескольким строкам с тем же индексом. - PullRequest
0 голосов
/ 05 мая 2020

У меня довольно сложная (для меня) ситуация, когда мне нужно обработать фрейм данных, который имеет несколько строк для каждого индекса, который может быть одним из трех сценариев ios в зависимости от значения определенного столбца.

Фрейм данных выглядит так:

Index   Account Postfix ID  val1    val2
AA11    AA      11      aa  1       2
AA11    AA      11      aa  1       2
AA11    AA      11      aa  1       2
BB22    BB      22      bb  1       1
BB22    BB      22      NA  2       2
BB22    BB      22      NA  3       3
CC33    CC      33      NA  1       2
CC33    CC      33      NA  1       2
CC33    CC      33      NA  1       2

Каждый уникальный индекс может попасть в один из трех сценариев ios:

  • A: ID всегда заполняется, возьмите val1 и val2 из первой строки по каждому индексу
  • S: ID иногда заполняется, берется val1 из строки, где ID! = Na, и val2 суммируются из строк, где ID = Na
  • N: ID никогда не заполняется , сумма val1 и val2 по всем строкам

Моя первая проблема заключается в том, что я не могу понять, как проверить значение столбца в нескольких строках для одного и того же индекса.

Я был думая что-то вроде:

indices = df.index.unique()
for index in indices:
    df[ScenarioA] = np.all(df.loc[index, ID])
    df[ScenarioN] = np.all(np.logical_not(df.loc[index, ID]))
    df[ScenarioS] = np.logical_and(np.logical_not(df[ScenarioA]),np.logical_not(df[ScenarioN]))

Но это приводит к тому, что все строки помечаются как ScenarioN, когда на самом деле результат должен выглядеть так:

Index   Account Postfix ID  val1    val2  ScenarioA ScenarioS ScenarioN
AA11    AA      11      aa  1       2     True      False     False
AA11    AA      11      aa  1       2     True      False     False
AA11    AA      11      aa  1       2     True      False     False
BB22    BB      22      bb  1       1     False     True      False
BB22    BB      22      NA  2       2     False     True      False
BB22    BB      22      NA  3       3     False     True      False
CC33    CC      33      NA  1       2     False     False     True
CC33    CC      33      NA  1       2     False     False     True
CC33    CC      33      NA  1       2     False     False     True

Как только я это сделал, я нужно выполнить суммы и закончить с чем-то вроде приведенного ниже, но я не думаю, что эта часть будет слишком сложной, поскольку я могу go по Сценарию и выполнять вычисления по мере необходимости:

Index   Account Postfix ID  val1    val2
AA11    AA      11      aa  1       2
BB22    BB      22      bb  1       5
CC33    CC      33      NA  3       6

Что я делаю не так в части, где Я пытаюсь назначить T / F столбцам сценария?

1 Ответ

1 голос
/ 06 мая 2020

не уверен, что это то, что вам нужно, надеюсь, это может помочь вам в решении конкретной задачи c:

grouping = df.groupby('Index').ID

#create some anonymous functions
#determine groups that completely have no null
#those that have some null
#those that have nulls all through
alls = lambda x: x.isna().all()
anys = lambda x: x.isna().any()
notnull = lambda x: x.notna().all()
all_null = grouping.apply(alls)
any_null = grouping.apply(anys)
all_not_null = grouping.apply(notnull)

#get the individual groups
full = all_not_null.index[all_not_null.array]
empty = all_null.index[all_null.array]
partially_empty = any_null.index[any_null.array].difference(empty)

#get the different dataframes for each group
step1 = df.loc[df.Index.isin(full)].groupby('Index').first()


#some nulls
cond1 = df.Index.isin(partially_empty) & (df.ID.notna())
cond2 = df.Index.isin(partially_empty) &(df.ID.isna())

step2 = df.loc[cond1]
step2 = step2.assign(val2 = df.loc[cond2,'val2'].sum())

#nulls all the way
step3 = df.loc[df.Index.isin(empty)]
temp = step3.groupby(['Index']).agg({'val1':'sum','val2':'sum'})

step3 = step3.drop_duplicates('Index')
step3 = step3.assign(val1 = temp['val1'].squeeze(), val2 = temp['val2'].squeeze())

#combine the three dataframes
pd.concat([step1.reset_index(),step2,step3],ignore_index=True)

    Index   Account Postfix ID  val1    val2
0   AA11      AA      11    aa    1      2
1   BB22      BB      22    bb    1      5
2   CC33      CC      33    NaN   3      6
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...