Изменить столбец в соответствии с другим кадром данных столбца python - PullRequest
1 голос
/ 16 июня 2020

У меня есть два фрейма данных. Один - это основной фрейм данных, а другой df используется для заполнения моего основного фрейма данных.

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

Это пример master df

| id | Purch. order | cost | size | code |
| 1  |    G918282   | 8283 | large| hchs |
| 2  |    EE18282   | 1283 | small| ueus |
| 3  |    DD08282   | 5583 | large| kdks |
| 4  |    GU88912   | 8232 | large| jdhd |
| 5  |     NaN      | 1283 | large| jdjd |
| 6  |     Nan      | 5583 | large| qqas |
| 7  |     Nan      | 8232 | large| djjs |

Это пример другого df

| id | Purch. order | cost |
| 1  |    G918282   | 7728 |
| 2  |    EE18282   | 2211 |
| 3  |    DD08282   | 5321 |
| 4  |    GU88912   | 4778 |
| 5  |     NaN      | 4283 |
| 6  |     Nan      | 9993 |
| 7  |     Nan      | 3442 |

Это результат, который я хотел бы

| id | Purch. order | cost | size | code |
| 1  |    G918282   | 7728 | large| hchs |
| 2  |    EE18282   | 2211 | small| ueus |
| 3  |    DD08282   | 5321 | large| kdks |
| 4  |    GU88912   | 4778 | large| jdhd |
| 5  |     NaN      | 1283 | large| jdjd |
| 6  |     Nan      | 5583 | large| qqas |
| 7  |     Nan      | 8232 | large| djjs |

Где изменяется только столбец стоимости, только если вторичный df совпадает с покупкой. order, и если это не NaN.

Я надеюсь, что вы можете мне помочь ... и мне очень жаль, если мой английский sh такой basi c, а не мой родной язык. Большое спасибо.

Ответы [ 2 ]

1 голос
/ 16 июня 2020

давайте попробуем Update, который работает с индексами, по умолчанию overwrite установлен на True, который перезапишет перекрывающиеся значения в вашем целевом фрейме данных. используйте overwrite=False, если вы хотите изменить только значения NA.

master_df = master_df.set_index(['id','Purch. order'])
another_df = another_df.dropna(subset=['Purch. order']).set_index(['id','Purch. order'])

master_df.update(another_df)
print(master_df)
                   cost    size   code
id Purch. order                       
1  G918282       7728.0   large   hchs
2  EE18282       2211.0   small   ueus
3  DD08282       5321.0   large   kdks
4  GU88912       4778.0   large   jdhd
5  NaN           1283.0   large   jdjd
6  Nan           5583.0   large   qqas
7  Nan           8232.0   large   djjs
0 голосов
/ 16 июня 2020

Вы можете сделать это с помощью merge с последующим обновлением столбца стоимости на основе Nan:

final_df = df1.merge(df2[~df2["Purch. order"].isna()], on = 'Purch. order', how="left")

final_df.loc[~final_df['Purch. order'].isnull(), "cost"] = final_df['cost_y'] # not nan
final_df.loc[final_df['Purch. order'].isnull(), "cost"] = final_df['cost_x'] # nan
final_df = final_df.drop(['id_y','cost_x','cost_y'],axis=1)

Результат:

id _x  Purch. order size    code    cost
    0   1   G918282 large   hchs    7728.0
    1   2   EE18282 small   ueus    2211.0
    2   3   DD08282 large   kdks    5321.0
    3   4   GU88912 large   jdhd    4778.0
    4   5   NaN     large   jdjd    1283.0
    5   6   NaN     large   qqas    5583.0
    6   7   NaN     large   djjs    8232.0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...