Использование pd.concat для репликации pd.merge Pandas - PullRequest
0 голосов
/ 29 октября 2019

Допустим, у меня есть 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

Ответы [ 2 ]

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

Вы можете сделать:

concated = pd.concat([df, df2, df3], sort=False).groupby('Week').first()
result = concated[concated.index.isin(('W1', 'W2', 'W3', 'W4', 'W5', 'W6', 'W7'))]
print(result)

Вывод

          A     B   C
Week                 
W1     34.0   NaN NaN
W2     67.0   NaN NaN
W3     92.0   NaN NaN
W4     31.0  75.0 NaN
W5     90.0   NaN NaN
W6    100.0  53.0 NaN
W7    101.0  21.0 NaN
0 голосов
/ 29 октября 2019

Я бы просто включил метод слияния, потому что он более лаконичен, а разница в скорости не заметна, если у вас нет больших данных.

df = df1.merge(df2, how='left').merge(df3, how='left')
print(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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...