首页 > 解决方案 > 加入类似的 pandas DataFrame 列,对它们进行排序并填充 np.NaN

问题描述

我正在尝试将多个 DataFrame 对象与一列连接,每个对象具有相似的字符串值。我希望输出是单个 DataFrame,其中字符串值按字母顺序排列,其他列中的缺失值用 np.NaN 填充。

import pandas as pd
import numpy as np

数据框

list1 = [{'1':'APA'}, {'1':'HBO'}, {'1': 'JRC'}]
list2 = [{'2':'ABC'}, {'2':'HBO'}, {'2': 'JRC'}, {'2':'XYZ'}]
list3 = [{'3':'QRS'}, {'3':'XYZ'}]

df1 = pd.DataFrame(list1)
df2 = pd.DataFrame(list2)
df3 = pd.DataFrame(list3)

这些看起来像这样:

df1

     1
0  APA
1  HBO
2  JRC

df2

     2
0  ABC
1  HBO
2  JRC
3  XYZ

df3

     3
0  QRS
1  XYZ

我希望最终输出如下所示:

df_join

     1    2    3
0  NaN  ABC  NaN
1  APA  NaN  NaN
2  HBO  HBO  NaN
3  JRC  JRC  NaN
4  NaN  NaN  QRS
5  NaN  XYZ  XYZ

我尝试过使用两个outer join操作,但这只是将NaNs 放在每列的开头或结尾。如果您有任何建议,请告诉我。谢谢你。

标签: pythonpandasdataframejoin

解决方案


设置所有索引!!(这可能真的很慢)np.unique负责字母排序。


def f(df, total):
    return df.set_index(df.iloc[:, 0]).reindex(total)

un = np.unique(np.concatenate((df1.values, df2.values, df3.values)))

pd.concat([*map(f, [df1, df2, df3], (un,)*3)], axis=1).reset_index(drop=1)

     1    2    3
0  NaN  ABC  NaN
1  APA  NaN  NaN
2  HBO  HBO  NaN
3  JRC  JRC  NaN
4  NaN  NaN  QRS
5  NaN  XYZ  XYZ

推荐阅读