У меня есть 3 кадра данных pandas, каждый из которых содержит 1 столбец.
df1 = pd.DataFrame({'col1':[111, 222, 333, 444, 555]})
df2 = pd.DataFrame({'col2':[222, 333, 555]})
df3 = pd.DataFrame({'col3':[111, 222, 333, 666]})
Я знаю, как объединить их по колонкам:
pd.concat([df1, df2, df3], axis=1)
col1 col2 col3
111 222 111
222 333 222
333 555 333
444 NaN 666
555 NaN NaN
Я хочу, чтобы первая строка всех столбцов была 111
, если 111
недоступна, это будет NaN
, и это относится к последующим строкам.
Я хотел бы сортировать числа так, чтобы конечный результат был таким:
col1 col2 col3
111 NaN 111
222 222 222
333 333 333
444 NaN NaN
555 555 NaN
NaN NaN 666
Возможно ли это в пандах?
Да, возможно, используйте set_index
с параметром drop=False
для индекса из столбца:
df1 = pd.DataFrame({'col1':[111, 222, 333, 444, 555]})
df2 = pd.DataFrame({'col2':[222, 333, 555]})
df3 = pd.DataFrame({'col3':[111, 222, 333, 666]})
df11 = df1.set_index('col1', drop=False)
df22 = df2.set_index('col2', drop=False)
df33 = df3.set_index('col3', drop=False)
dfs1 = [df11, df22, df33]
df = pd.concat(dfs1, axis=1)
print (df)
col1 col2 col3
111 111.0 NaN 111.0
222 222.0 222.0 222.0
333 333.0 333.0 333.0
444 444.0 NaN NaN
555 555.0 555.0 NaN
666 NaN NaN 666.0
df = pd.concat(dfs1, axis=1).reset_index(drop=True)
print (df)
col1 col2 col3
0 111.0 NaN 111.0
1 222.0 222.0 222.0
2 333.0 333.0 333.0
3 444.0 NaN NaN
4 555.0 555.0 NaN
5 NaN NaN 666.0
Если хотите присоединиться к первому столбцу:
L = [x.set_index(x.columns[0], drop=False) for x in dfs]
df = pd.concat(L, axis=1).reset_index(drop=True)
print (df)
col1 col2 col3
0 111.0 NaN 111.0
1 222.0 222.0 222.0
2 333.0 333.0 333.0
3 444.0 NaN NaN
4 555.0 555.0 NaN
5 NaN NaN 666.0
Вы можете попробовать объединить данные в первый столбец
df= f1
for f in [df2,df3]:
df = df.merge(f,left_on=df.columns[0],right_on=f.columns[0],how='outer')
Из:
col1 col2 col3
0 111.0 NaN 111.0
1 222.0 222.0 222.0
2 333.0 333.0 333.0
3 444.0 NaN NaN
4 555.0 555.0 NaN
5 NaN NaN 666.0