Допустим, у меня есть 3 df
, такие как приведенные ниже:
df = pd.DataFrame({'Week': ['W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7'], 'A': [34, 67, 92, 31, 90, 100, 101]})
df2 = pd.DataFrame({'Week': ['W4', 'W5', 'W6', 'W7', 'W8', 'W9', 'W10'], 'B': [75, np.nan, 53, 21, 94, 47, 88]})
df3 = pd.DataFrame({'Week': ['W12', 'W13', 'W14', 'W15', 'W16', 'W17', 'W18'], 'C': [25, 30, 40, 45, 46, 47, 48]})
Обычно, когда я строю свою базу данных цен на акции, я использовал бы pd.merge
и использовал бы очень полезный on='Week'
(в данном случае) функция для объединения фреймов данных с использованием столбца Week. Поэтому мой код будет выглядеть примерно так:
df = pd.merge(df, df2, on='Week', how='left')
df = pd.merge(df, df3, on='Week', how='left')
Производим следующее df
:
Week A B C
0 W1 34 NaN NaN
1 W2 67 NaN NaN
2 W3 92 NaN NaN
3 W4 31 75.0 NaN
4 W5 90 NaN NaN
5 W6 100 53.0 NaN
6 W7 101 21.0 NaN
Это идеально, я хочу видеть данные только для W1 - W7, еслинет данных, я просто хочу NaN.
Я уверен, что использование pd.concat
намного быстрее, чем pd.merge
, и, поскольку я смотрю на сотни акций, это действительно может помочь сократить время, которое требуетсяпостроить мой df
. Но, конечно, очень важно, чтобы даты точно совпадали, поэтому я использовал функцию on=
в pd.merge
.
Пока не могу понять, как воспроизвести это поведение, используя pd.concat
. У кого-нибудь есть предложения? То, что я пробовал до сих пор, выглядит так:
df = pd.concat([df, df2], sort=True).groupby('Week').mean()
Но это приводит к следующему, что даже близко не соответствует тому, что я хочу:
A B
Week
W1 34.0 NaN
W10 NaN 88.0
W2 67.0 NaN
W3 92.0 NaN
W4 31.0 75.0
W5 90.0 NaN
W6 100.0 53.0
W7 101.0 21.0
W8 NaN 94.0
W9 NaN 47.0
Anyпомощь была бы очень признательна, ура
РЕДАКТИРОВАТЬ:
Извините, просто чтобы уточнить, мой ожидаемый результат на полпути вниз df
, этот:
Week A B C
0 W1 34 NaN NaN
1 W2 67 NaN NaN
2 W3 92 NaN NaN
3 W4 31 75.0 NaN
4 W5 90 NaN NaN
5 W6 100 53.0 NaN
6 W7 101 21.0 NaN