Добавление столбца со значениями из другого кадра данных на основе условий столбца - PullRequest
0 голосов
/ 22 апреля 2020

У меня есть два кадра данных различной длины индекса, которые выглядят так:

df_1:

    State  Month  Total Time ... N columns
     AL     4       1000
     AL     5       500
      .
      .
      .
     VA     11      750
     VA     12      1500 

df_2:

    State   Month ... N columns
     AL      4        
     AL      5
      .
      .
      .
     VA      11
     VA      12

Я хотел бы добавить Столбец общего времени до df_2, в котором используются значения из столбца общего времени df_1, если значения State и Month совпадают между кадрами данных. В конечном итоге я получу:

df_2:

    State  Month  Total Time ... N columns
     AL     4       1000
     AL     5       500
      .
      .
      .
     VA     11      750
     VA     12      1500 

Я хочу сделать это условно, поскольку длины индексов не одинаковы. Я пробовал это до сих пор:

def f(row):
     if (row['State'] == row['State']) & (row['Month'] == row['Month']):
         val = x for x in df_1["Total Time"]
     return val

df_2['Total Time'] = df_2.apply(f, axis=1)

Это не сработало. Какой метод вы бы использовали для достижения этой цели? Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020

Вы можете сделать это:

Рассмотрим мои образцы данных:

In [2327]: df_1                                                                                                                                                                                              
Out[2327]: 
  State  Month  Total Time
0    AL      2        1000
1    AB      4         500
2    BC      1         600

In [2328]: df_2                                                                                                                                                                                              
Out[2328]: 
  State  Month
0    AL      2
1    AB      5

In [2329]: df_2 = pd.merge(df_2, df_1, on=['State', 'Month'], how='left')                                                                                                                                      

In [2330]: df_2                                                                                                                                                                                              
Out[2330]: 
  State  Month  Total Time
0    AL      2      1000.0
1    AB      5         NaN
0 голосов
/ 23 апреля 2020

Как уже упоминалось в другом комментарии, pd.merge () - это то, как вы должны объединить два фрейма данных и извлечь столбец. Проблема заключается в том, что слияние только «State» и «Month» приведет к тому, что каждая перестановка станет новым столбцом (все Al-4 в df_1 объединятся со всеми другими AL-4 в df_2).

С вашим Например, будет

df_1
  State  Month  Total Time  df_1 col...
0    AL      4        1000            6
1    AL      4         500            7
2    VA     12         750            8
3    VA     12        1500            9

df_2
  State  Month  df_2 col...
0    AL      4            1
1    AL      4            2
2    VA     12            3
3    VA     12            4


df_1_cols_to_use = ['State', 'Month', 'Total Time']
# note the selection of the column to use from df_1. We only want the column
# we're merging on, plus the column(s) we want to bring in, in this case 'Total Time'
new_df = pd.merge(df_2, df_1[df_1_cols_to_use], on=['State', 'Month'], how='left')

new_df:
  State  Month  df_2 col...  Total Time
0    AL      4            1        1000
1    AL      4            1         500
2    AL      4            2        1000
3    AL      4            2         500
4    VA     12            3         750
5    VA     12            3        1500
6    VA     12            4         750
7    VA     12            4        1500

Вы упоминаете, что они имеют разные длины индекса. Основываясь на параметрах вопроса, невозможно определить, какое значение Total Time будет соответствовать строке в df_2. Если в df_2 есть три записи AL-4, получают ли они по 1000, 500 или какую-то комбинацию? Эта информация будет необходима. Без этого это было бы лучшим предположением для получения всех возможностей.

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