1-й фрейм данных это (df1
):
Col1 Col2
abc 5
xyz 153
yyy 24
zzz 90
Второй фрейм данных такой (df2
):
col3 col
233 533
Это результат, который я хочу (Concat df2 на df1 по оси = 1 во всех строках):
Col1 Col2 col3 col
abc 5 233 533
xyz 153 233 533
yyy 24 233 533
zzz 90 233 533
Но когда я делаю pd.concat([df1,df2],axis=1)
, я получаю такой результат:
Col1 Col2 col3 col
abc 5 233.0 533.0
xyz 153 NaN NaN
yyy 24 NaN NaN
zzz 90 NaN NaN
Преобразуйте свой второй DataFrame в dict и заново создайте DataFrame перед их конкатенацией:
>>> pd.concat([df1, pd.DataFrame(df2.to_dict('list'), index=df1.index)], axis=1)
Col1 Col2 col3 col
0 abc 5 233 533
1 xyz 153 233 533
2 yyy 24 233 533
3 zzz 90 233 533
Использовать:
output = df1.join(df2).ffill()
Выход:
Col1 Col2 col3 col
0 abc 5 233.0 533.0
1 xyz 153 233.0 533.0
2 yyy 24 233.0 533.0
3 zzz 90 233.0 533.0
Одним из быстрых методов является expand_grid из пиянитор:
# pip install pyjanitor
import pandas as pd
import janitor as jn
others = {'df1':df1, 'df2':df2}
jn.expand_grid(others = others).droplevel(axis = 1, level = 0)
Col1 Col2 col3 col
0 abc 5 233 533
1 xyz 153 233 533
2 yyy 24 233 533
3 zzz 90 233 533
Спасибо, этот ответ кажется на 1 мс быстрее, чем решение Корралиена на моем реальном фрейме данных. Но я бы предпочел использовать ответ corralien, так как он прост и требует на 1 библиотеку меньше.
Работает, но решение Corralien занимает 32 мс, а ваше решение - 65 мс на моем реальном df. Форма df1 — это
548x2500
, а форма df2 — это1x226
в моем реальном df.