Как объединить маленький pandas.dataframe в больший по значениям столбца? - PullRequest
0 голосов
/ 17 сентября 2018

У меня есть два pandas.dataframe df1 и df2:

>>>import pandas as pd
>>>import numpy as np
>>>from random import random
>>>df1=pd.DataFrame({'x1':range(10), 'y1':np.repeat(0,10).tolist()})
>>>df2=pd.DataFrame({'x2':range(0,10,2), 'y2':[random() for _ in range(5)]})
>>>df1
   x1  y1
0   0   0
1   1   0
2   2   0
3   3   0
4   4   0
5   5   0
6   6   0
7   7   0
8   8   0
9   9   0
>>>df2
   x2        y2
0   0  0.075922
1   2  0.606703
2   4  0.272918
3   6  0.842641
4   8  0.576636

Теперь я хочу соединить df2 с df1.Это значит, что я хочу изменить значения y1 в df1 на значения y2 в df2, когда значение x1 в df1 равно значению x2 в df2.Конечный результат, который мне нужен, выглядит следующим образом:

>>>df1
   x1        y1
0   0  0.075922
1   1  0
2   2  0.606703
3   3  0
4   4  0.272918
5   5  0
6   6  0.842641
7   7  0
8   8  0.576636
9   9  0

Хотя я могу использовать следующие коды для получения вышеуказанного результата:

>>> for i in range(df1.shape[0]):
...     for j in range(df2.shape[0]):
...             if df1.iloc[i,0] == df2.iloc[j,0]:
...                     df1.iloc[i,1]=df2.iloc[j,1]
... 

Я думаю, что должны быть лучшие способы достиженияэтот.Ты знаешь, кто они?Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 17 сентября 2018

Update () , кажется, лучший вариант здесь!

import pandas as pd
import numpy as np
from random import random

# your dataframes
df1 = pd.DataFrame({'x1': range(10), 'y1': np.repeat(0, 10).tolist()})
df2 = pd.DataFrame({'x2': range(0, 10, 2), 'y2': [random() for _ in range(5)]})

# printing df1 and df2 values before update
print(df1)
print(df2)

df1.update({'y1': df2.set_index('x2')['y2']})

# printing df1 after update was performed
print(df1)
0 голосов
/ 17 сентября 2018

Вы также можете использовать update после установки индексов обоих информационных фреймов:

import pandas as pd
import numpy as np
from random import random
df1=pd.DataFrame({'x1':range(10), 'y1':np.repeat(0,10).tolist()})

#set index of the first dataframe to be 'x1'
df1.set_index('x1', inplace=True)

df2=pd.DataFrame({'x2':range(0,10,2), 'y1':[random() for _ in range(5)]})

#set index of the second dataframe to be 'x2'
df2.set_index('x2', inplace=True)

#update values in df1 with values in df 
df1.update(df2)

#reset index if necessary (though index will look exactly like x1 column)
df1 = df1.reset_index()
0 голосов
/ 17 сентября 2018

Вы можете использовать df.update для обновления вашего df1 на месте, например:

df1.update({'y1': df2.set_index('x2')['y2']})

Дает вам:

   x1        y1
0   0  0.075922
1   1  0.000000
2   2  0.606703
3   3  0.000000
4   4  0.272918
5   5  0.000000
6   6  0.842641
7   7  0.000000
8   8  0.576636
9   9  0.000000
0 голосов
/ 17 сентября 2018

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

df1['y1'] = df1['x1'].map(df2.set_index('x2')['y2']).fillna(df1['y1'])
print (df)
   x1        y1
0   0  0.696469
1   1  0.000000
2   2  0.286139
3   3  0.000000
4   4  0.226851
5   5  0.000000
6   6  0.551315
7   7  0.000000
8   8  0.719469
9   9  0.000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...