ValueError: данные перекрываются. в питоне - PullRequest
0 голосов
/ 02 октября 2019

У меня есть фрейм данных df3 , который выглядит следующим образом

с неизвестной длиной столбцов, так как AAA _ ??? может быть любым из набора данных

           Date    ID  Calendar_Year Month   DayName...  AAA_1E AAA_BMITH  AAA_4.1  AAA_CH
0    2019-09-17  8661           2019   Sep       Sun...     NaN       NaN      NaN     NaN
1    2019-09-18  8662           2019   Sep       Sun...     1.0       3.0     34.0     1.0
2    2019-09-19  8663           2019   Sep       Sun...     NaN       NaN      NaN     NaN
3    2019-09-20  8664           2019   Sep       Mon...     NaN       NaN      NaN     NaN
4    2019-09-20  8664           2019   Sep       Mon...     2.0       4.0     32.0     3.0
5    2019-09-20  8664           2019   Sep       Sat...     NaN       NaN      NaN     NaN
6    2019-09-20  8664           2019   Sep       Sat...     NaN       NaN      NaN     NaN
7    2019-09-20  8664           2019   Sep       Sat...     0.0       4.0     30.0     0.0

другой фрейм данных dfMeans со средним значением третьего фрейма данных

     Month Dayname           ID  ...  AAA_BMITH    AAA_4.1  AAA_CH
0      Jan     Thu  7686.500000  ...   0.000000  28.045455     0.0
1      Jan     Fri  7636.272727  ...   0.000000  28.136364     0.0
2      Jan     Sat  7637.272727  ...   0.000000  27.045455     0.0
3      Jan     Sun  7670.090909  ...   0.000000  27.090909     0.0
4      Jan     Mon  7702.909091  ...   0.000000  27.727273     0.0
5      Jan     Tue  7734.260870  ...   0.000000  27.956522     0.0

к фреймам данных будут присоединены Месяц и Имя дня

Я хочу заменить NaN в df3 значениями из dfMean

, используя эту строку

df3.update(dfMeans, overwrite=False, errors="raise")

, но я получаю эту ошибку

повышение ValueError («Перекрытия данных»)

ValueError: Перекрытия данных.

Как обновить NaN со значениями из dfMean и избежатьэта ошибка?

Редактировать:

Я поместил все кадры данных в один кадр данных df

     Month Dayname           ID  ...  AAA_BMITH    AAA_4.1  AAA_CH
0      Jan     Thu  7686.500000  ...   0.000000  28.045455     0.0
1      Jan     Fri  7636.272727  ...   0.000000  28.136364     0.0
2      Jan     Sat  7637.272727  ...   0.000000  27.045455     0.0
3      Jan     Sun  7670.090909  ...   0.000000  27.090909     0.0
4      Jan     Mon  7702.909091  ...   0.000000  27.727273     0.0
5      Jan     Tue  7734.260870  ...   0.000000  27.956522     0.0

Как я могу заполнить NaN средним значением на основе Месяц и Днем ?

Ответы [ 2 ]

2 голосов
/ 02 октября 2019

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

Данные:

       Date    ID  Calendar_Year Month Dayname  AAA_1E  AAA_BMITH  AAA_4.1  AAA_CH
 2019-09-17  8661           2019   Jan     Sun     NaN        NaN      NaN     NaN
 2019-09-18  8662           2019   Jan     Sun     1.0        3.0     34.0     1.0
 2019-09-19  8663           2019   Jan     Sun     NaN        NaN      NaN     NaN
 2019-09-20  8664           2019   Jan     Mon     NaN        NaN      NaN     NaN
 2019-09-20  8664           2019   Jan     Mon     2.0        4.0     32.0     3.0
 2019-09-20  8664           2019   Jan     Sat     NaN        NaN      NaN     NaN
 2019-09-20  8664           2019   Jan     Sat     NaN        NaN      NaN     NaN
 2019-09-20  8664           2019   Jan     Sat     0.0        4.0     30.0     0.0

df.set_index(['Month', 'Dayname'], inplace=True)

enter image description here

df_mean:

Month Dayname           ID  AAA_BMITH    AAA_4.1  AAA_CH
  Jan     Thu  7686.500000        0.0  28.045455     0.0
  Jan     Fri  7636.272727        0.0  28.136364     0.0
  Jan     Sat  7637.272727        0.0  27.045455     0.0
  Jan     Sun  7670.090909        0.0  27.090909     0.0
  Jan     Mon  7702.909091        0.0  27.727273     0.0
  Jan     Tue  7734.260870        0.0  27.956522     0.0

df_mean.set_index(['Month', 'Dayname'], inplace=True)

enter image description here

Обновление df:

  • Эта операция основана на сопоставлении значений индекса
  • Он не работает с несколькими именами столбцов одновременно, вам нужно получить интересующие столбцы и перебрать их
  • Примечание. AAA_1E не в df_mean
for col in df.columns:
    if col in df_mean.columns:
        df[col].fillna(df_mean[col], inplace=True)

enter image description here

1 голос
/ 02 октября 2019

Вы можете groupby на 'Month' и DayName' и использовать apply для редактирования кадра данных.
Используйте fillna для заполнения значений Nan. fillna принимает словарь в качестве параметра value: ключи словаря являются именами столбцов, значения - скалярами: скаляры используются для замены Nan в каждом столбце. С помощью loc вы можете выбрать правильное значение из dMeans. Вы можете создать словарь с точным пониманием, используя пересечение между столбцами df3 и dfMeans.

Все это соответствует следующему утверждению:

df3filled = df3.groupby(['Month', 'DayName']).apply(lambda x : x.fillna(
    {col : dfMeans.loc[(dfMeans['Month'] == x.name[0]) & (dfMeans['Dayname'] == x.name[1]), col].iloc[0]
    for col in x.columns.intersection(dfMeans.columns)})).reset_index(drop=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...