Сложный запрос поиска данных - PullRequest
1 голос
/ 22 марта 2019

Я почти уверен, что уже есть вопрос для этого, так что если кто-то может просто указать мне правильное направление.

У меня есть два кадра данных, DF1:

+----------+-----------+------------+-------------+--------------------+
| Survived |  Surname  | FamilySize | NumSurvived | FamilySurvivalRate |
+----------+-----------+------------+-------------+--------------------+
|        0 | Braund    |          2 |           0 | 0                  |
|        1 | Cumings   |          1 |           1 | 1                  |
|        1 | Heikkinen |          1 |           1 | 1                  |
|        1 | Futrelle  |          2 |           1 | 0.5                |
|        0 | Allen     |          2 |           1 | 0.5                |
|        0 | Moran     |          3 |           1 | 0.333333333        |
|        0 | McCarthy  |          1 |           0 | 0                  |
|        0 | Palsson   |          4 |           0 | 0                  |
+----------+-----------+------------+-------------+--------------------+

иDF2:

+----------+-----------+------------+-------------+--------------------+
| Survived |  Surname  | FamilySize | NumSurvived | FamilySurvivalRate |
+----------+-----------+------------+-------------+--------------------+
|        0 | Braund    |          2 |           0 |                    |
|        1 | Cumings   |          1 |           1 |                    |
|        1 | Heikkinen |          1 |           1 |                    |
|        1 | Futrelle  |          2 |           1 |                    |
|        0 | Allen     |          2 |           1 |                    |
|        0 | Moran     |          3 |           1 |                    |
|        0 | McCarthy  |          1 |           0 |                    |
|        0 | Palsson   |          4 |           0 |                    |
+----------+-----------+------------+-------------+--------------------+

Для каждой фамилии в DF2 мне нужно найти FamilySurvivalRate для этой фамилии в DF1 и поместить значение в DF2.Если фамилия не в DF1, она должна быть 0.

Спасибо!

Ответы [ 5 ]

1 голос
/ 22 марта 2019

Используйте Series.map от Series, созданного из df1 и Series.fillna для замены несоответствующих значений:

print (df2)
  Survived    Surname  FamilySize  NumSurvived
0         0     Braund           2            0
1         1   Cumings1           1            1 <- change surname for no match
2         1  Heikkinen           1            1
3         1   Futrelle           2            1
4         0      Allen           2            1
5         0      Moran           3            1
6         0   McCarthy           1            0
7         0    Palsson           4            0

s = df1.set_index('Surname')['FamilySurvivalRate']
df2['FamilySurvivalRate'] = df2['Surname'].map(s).fillna(0)
print (df2)
   Survived    Surname  FamilySize  NumSurvived  FamilySurvivalRate
0         0     Braund           2            0            0.000000
1         1   Cumings1           1            1            0.000000
2         1  Heikkinen           1            1            1.000000
3         1   Futrelle           2            1            0.500000
4         0      Allen           2            1            0.500000
5         0      Moran           3            1            0.333333
6         0   McCarthy           1            0            0.000000
7         0    Palsson           4            0            0.000000
0 голосов
/ 22 марта 2019

Я думаю, что то же самое может быть достигнуто с помощью слияния ().

df2.merge(df1[["Surname","FamilySurvivalRate"]],how ='left', on = "Surname").fillna(0)
0 голосов
/ 22 марта 2019

Попробуйте, надеюсь, это решит вашу проблему

df2 = df2.drop('FamilySurvivalRate', axis=1)
df2 = pd.merge(left=df2, right=df1[['Surname','FamilySurvivalRate']], on='Surname')
df2
0 голосов
/ 22 марта 2019

Вы можете попробовать что-то вроде:

DF2.loc[DF2['Surname']==DF1['Surname'],['FamilySurvivalRate']] = DF1['FamilySurvivalRate']

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.loc.html

0 голосов
/ 22 марта 2019

Вам необходимо объединить оба кадра данных на основе записей, присутствующих в DF2, а затем заполнить отсутствующие значения 0:

(
    df2
    # Remove FamilySurvivalRate from DF2, as it is of not interest
    .drop(columns=["FamilySurvivalRate"]
    # Retrieve possibly existing values from df1
    .merge(df1, how="left")
    # Fill missing values with 0
    .fillna({"FamilySurvivalRate": 0})
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...