сравнивая значения в двух pandas данных, чтобы сохранить счетчик - PullRequest
0 голосов
/ 28 февраля 2020

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

Настройка:

У меня есть два фрейма данных, первый содержит список всех возможных значений в первом столбце, в этом столбце нет повторяющихся значений , Давайте назовем это df_01. Тезисы - это все общие возможные значения в каждом списке. Все дополнительные столбцы представляют собой независимые списки. Каждый из них содержит число, которое показывает, сколько дней любое данное значение всех возможных значений было в этом списке. Этот кадр данных (df_01) имеет форму (9277, 32). Эти размеры могут измениться, но в целом останутся прежними. Ниже приведен небольшой пример того, как это выглядит.

df_01 перед любыми действиями:

index   values   list01   list02  ... list30   list31
  0       aaa      5         1    ...   NaN      83
  1       bbb     NaN       NaN   ...   NaN      4
  2       ccc      20       NaN   ...   NaN      32
  3       ddd      1         27   ...   NaN     NaN
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .  
  9274    qqq     NaN        15   ...   NaN      6 
  9275    rrr     238       NaN   ...   NaN     102
  9276    sss      3         2    ...   NaN     NaN
  9277    ttt      12       NaN   ...   NaN      99

Этот первый кадр данных (df_01) всегда будет значениями, которые были в предыдущий день.

Второй кадр данных. Давайте назовем это df_2 всегда будет иметь меньше строк и будет меняться изо дня в день по длине, но всегда будет иметь такое же количество столбцов, как (df_01). В настоящее время он имеет форму (1351, 32). В этом кадре данных (df_2) первый столбец имеет все общие значения из каждого списка на сегодняшний день и не имеет дубликатов. Другие столбцы в этом фрейме данных (df_2) имеют 1, если значение находится в списке сегодня, и NaN, если его нет. Вот пример.

df_02 перед любыми действиями:

index   values   list01   list02  ... list30   list31
  0       aaa      1         1    ...   NaN      1
  1       bbb     NaN        1    ...    1       1
  2       ddd      1         1    ...   NaN     NaN
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .  
  1349    qqq     NaN       NaN   ...    1       1 
  1350    rrr      1        NaN   ...    1      NaN
  1351    sss     NaN        1    ...   NaN      1

Вопрос:

Что я хочу сделать sh заключается в следующем.

1) Для каждого значения в каждом столбце, если значение существует в первом кадре данных (df_01), а не во втором (df_02), его счетчик в (df_01) будет сбрасываться в NaN для каждого столбца.

2) Затем для каждого значения в каждом столбце второго кадра данных (df_02), если значение существует в одном и том же столбце на обоих кадрах данных, суммируйте значения.

3) Если aaa в list01 of (df_01) = 5 и aaa в list01 of (df_2) = 1, тогда aaa в list01 of (df_02) станет равным 6. Это сохранит текущий счет.

4) Если значение равно NaN, в обоих случаях никаких действий не требуется.

5) Если значение равно NaN (df_01) и 1 (df_02), оно остается равным 1.

*** Значение в df_02 всегда будет 1 или NaN до суммирования. Это двоичный выбор того, находится ли значение в столбце значений в отдельном списке в тот день или нет.

*** Обратите внимание на значение ccc, и ttt находятся в (df_01), поскольку они являются возможными значениями, но не (df_02), поскольку они не были ни в одном из списков сегодня.

*** Звездочка вокруг значений, таких как *NaN* или *6*, обозначает, что значения, которые будут меняться, на самом деле не будут в данных.

Кадры данных должны выглядеть следующим образом после процедуры:

df_01

index   values   list01   list02  ... list30   list31
  0       aaa      5         1    ...   NaN      83
  1       bbb     NaN       NaN   ...   NaN      4
  2       ccc     NaN       NaN   ...   NaN     NaN
  3       ddd      1         27   ...   NaN     NaN
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .  
  9274    qqq     NaN      *NaN*  ...   NaN      6 
  9275    rrr     238       NaN   ...   NaN     *NaN*
  9276    sss    *NaN*       2    ...   NaN      24
  9277    ttt      12       NaN   ...   NaN      99

df_02

index   values   list01   list02  ... list30   list31
  0       aaa     *6*       *2*   ...   NaN     *84*
  1       bbb     NaN        1    ...    1      *5*
  2       ddd     *2*      *28*   ...   NaN     NaN
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .
  .        .       .         .    ...    .       .  
  1349    qqq     NaN       NaN   ...    1      *7*
  1350    rrr    *239*      NaN   ...    1      NaN
  1351    sss     NaN       *3*   ...   NaN    *25*

Как бы я go решил что-то подобное? Я даже не знаю с чего начать. Буду признателен за любые идеи, даже если они не будут полностью работать, просто чтобы указать мне правильное направление. Пожалуйста, дайте мне знать, если что-то нужно уточнить.

Спасибо

1 Ответ

1 голос
/ 28 февраля 2020
df1 = df1.set_index('values')
df2 = df2.set_index('values')

cols = [*df1.columns]
for col in cols:
    #Update to df1
    df1[col].update(df2.loc[df2[col].isnull(), col].fillna('-'))
    df1[col].replace('-', np.NaN, inplace = True)

    #Update to df2, sum if they both have numbers
    df2[col].update(df2.loc[~df2[col].isnull(), col] + df1.loc[~df1[col].isnull(), col])

Это должно делать то, что вы хотите. Мы будем l oop по каждой строке, а затем обновлять их по отдельности. Убедитесь, что список cols содержит правильные столбцы, основанные на ваших df.

Причина, по которой мы должны использовать .fillna('-') при обновлении df1, заключается в том, что вы не можете заменить значение на NaN, поэтому мы нужно заполнить его чем-то другим, тогда мы можем заменить его обратно на NaN.

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