Pandas join/merge/concat два dataframes
У меня возникают проблемы с объединениями в pandas, и я пытаюсь выяснить, что не так. Скажем, у меня есть dataframe
x:
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1941 entries, 2004-10-19 00:00:00 to 2012-07-23 00:00:00
Data columns:
close 1941 non-null values
high 1941 non-null values
low 1941 non-null values
open 1941 non-null values
dtypes: float64(4)
Должен ли я присоединиться к нему с индексом y по индексу с простой командой соединения, где y = x, за исключением того, что colnames имеют +2.
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 1941 entries, 2004-10-19 00:00:00 to 2012-07-23 00:00:00
Data columns:
close2 1941 non-null values
high2 1941 non-null values
low2 1941 non-null values
open2 1941 non-null values
dtypes: float64(4)
y.join(x) or pandas.DataFrame.join(y,x):
<class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 34879 entries, 2004-12-16 00:00:00 to 2012-07-12 00:00:00
Data columns:
close2 34879 non-null values
high2 34879 non-null values
low2 34879 non-null values
open2 34879 non-null values
close 34879 non-null values
high 34879 non-null values
low 34879 non-null values
open 34879 non-null values
dtypes: float64(8)
Я ожидаю, что в финале будет значение non-values для обоих. Я тоже пытался слить, но у меня такая же проблема.
Я подумал, что правильный ответ был pandas.concat([x, y]), но это не делает то, что я намерен.
In [83]: pandas.concat([x,y])
Out[83]: <class 'pandas.core.frame.DataFrame'>
DatetimeIndex: 3882 entries, 2004-10-19 00:00:00 to 2012-07-23 00:00:00
Data columns:
close2 3882 non-null values
high2 3882 non-null values
low2 3882 non-null values
open2 3882 non-null values
dtypes: float64(4)
изменить:
Если у вас возникли проблемы с подключением, прочитайте Wes ниже. У меня была одна временная метка, которая была дублирована.
Ответы
Ответ 1
Имеет ли ваш индекс дубликаты x.index.is_unique
? Если это так объясняет поведение, которое вы видите:
In [16]: left
Out[16]:
a
2000-01-01 1
2000-01-01 1
2000-01-01 1
2000-01-02 2
2000-01-02 2
2000-01-02 2
In [17]: right
Out[17]:
b
2000-01-01 3
2000-01-01 3
2000-01-01 3
2000-01-02 4
2000-01-02 4
2000-01-02 4
In [18]: left.join(right)
Out[18]:
a b
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-01 1 3
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
2000-01-02 2 4
Ответ 2
Похоже, что вы хотите pandas.concat
? merge
и join
делают, ну, присоединяется, что означает, что они дадут вам что-то, основанное на декартовом произведении двух входов, но похоже, что вы просто хотите вставить их вместе в одну большую таблицу.
Изменить: вы пытались выполнить concat с помощью axis=1
? Кажется, он делает то, о чем вы просите:
>>> print x
A B C
0 0.155614 -0.252148 0.861163
1 0.973517 1.156465 -0.458846
2 2.504356 -0.356371 -0.737842
3 0.012994 1.785123 0.161667
4 0.574578 0.123689 0.017598
>>> print y
A2 B2 C2
0 -0.280993 1.278750 -0.704449
1 0.140282 1.955322 -0.953826
2 0.581997 -0.239829 2.227069
3 -0.876146 -1.955199 -0.155030
4 -0.518593 -2.630978 0.333264
>>> print pandas.concat([x, y], axis=1)
A B C A2 B2 C2
0 0.155614 -0.252148 0.861163 -0.280993 1.278750 -0.704449
1 0.973517 1.156465 -0.458846 0.140282 1.955322 -0.953826
2 2.504356 -0.356371 -0.737842 0.581997 -0.239829 2.227069
3 0.012994 1.785123 0.161667 -0.876146 -1.955199 -0.155030
4 0.574578 0.123689 0.017598 -0.518593 -2.630978 0.333264