Можем ли мы добавить ряд к полю во фрейме данных из другого фрейма данных?

#python #python-3.x #dataframe

#python #python-3.x #фрейм данных

Вопрос:

Я создал ряд из своего первого фрейма данных, вот так.

 myResult = df_append['schedule_code']
 

Теперь я хочу добавить этот ряд во второй фрейм данных как таковой.

 grouped_and_summed['schedule_code'] = myResult
 

Результатом являются все NaN.

#10;

'myResult' Поле представляет собой простой код, который был проанализирован в первом фрейме данных.

введите описание изображения здесь

Кажется, я не могу разобрать его во втором фрейме данных, и, похоже, я не могу скопировать его из первого фрейма данных. Должна быть возможность получить переменную и заполнить все в одном поле, верно. Есть какие-нибудь мысли, кто-нибудь?

Ответ №1:

Я использую pandas версии 1.0.1, и это, кажется, разрешено. Если вы запустите следующий код:

 import pandas as pd
# Generate data
df1_data = list(range(1,11))
df2_data = list(range(11,21))
# Create dataframes
df1 = pd.DataFrame(df1_data, columns = ['data_df1'])
df2 = pd.DataFrame(df2_data, columns = ['data_df2'])
df2['new_col'] = df1['data_df1']
print(df2)
 

Вы должны увидеть следующий вывод:

     data_df2    new_col
0   11          1
1   12          2
2   13          3
3   14          4
4   15          5
5   16          6
6   17          7
7   18          8
8   19          9
9   20          10
 

Я считаю, что это эквивалентно выполнению левого соединения для каждого индекса фрейма данных (если каждый состоит только из одного столбца, то есть, поскольку ряды pandas являются индексируемыми объектами). Если вы попытаетесь изменить индекс одного из этих фреймов данных, скажем, df1:

 import pandas as pd
# Generate data
df1_data = list(range(1,11))
df2_data = list(range(11,21))
# Create new index
new_index = list(range(1,11))
# Create dataframes and apply new index to df1
df1 = pd.DataFrame(df1_data, columns = ['data_df1'], index=new_index)
df2 = pd.DataFrame(df2_data, columns = ['data_df2'])
df2['new_col'] = df1['data_df1']
print(df2)
 

Вы должны увидеть следующий результат, поскольку новый индекс df1 начинается с 1, а индекс df2 по-прежнему начинается с 0:

     data_df2  new_col
0        11      NaN
1        12      1.0
2        13      2.0
3        14      3.0
4        15      4.0
5        16      5.0
6        17      6.0
7        18      7.0
8        19      8.0
9        20      9.0
 

В идеале, такого рода задачи лучше всего выполнять с помощью df.merge, вместо прямого присвоения столбца из одного фрейма данных другому, но если вы абсолютно уверены, что ваши измерения совпадают в каждом из фреймов данных, и оба фрейма данных упорядочены таким образом, что вы получите желаемый результатпросто скопировав из одного и вставив в другой, вы можете либо:

  1. сбросьте индексы, выполнив:
     grouped_and_summed.reset_index(inplace=True, drop=True)
    df_append.reset_index(inplace=True, drop=True)
    grouped_and_summed['schedule_code'] = df_append['schedule_code']
     
  2. Используйте атрибут .values для получения массива значений вместо индексированного ряда:
     grouped_and_summed['schedule_code'] = df_append['schedule_code'].values
     

Опять же, я бы настоятельно рекомендовал использовать df.merge, если это возможно, в целях согласованности.