python - Pandas :更新和合并数据框的更好方法

标签 python python-3.x pandas merge updates

考虑两个数据帧 df_adf_b:

>>> df_a = pd.DataFrame.from_dict({1: [1,2,3], 2: ["a", "b", "c"], 3:[4,5,6]})
>>> df_a.index = pd.Index([0,1,3])
>>> print(df_a)

   1  2  3
0  1  a  4
1  2  b  5
3  3  c  6

>>> df_b = pd.DataFrame.from_dict({2: ["d", "e", "f", "g"]})
>>> print(df_b)

   2
0  d
1  e
2  f
3  g

以及以下代码:

>>> df_a = pd.concat([df_a, df_b])
>>> df_c = df_a.loc[~df_a.index.duplicated(keep='last'),df_b.columns]
>>> df_d = df_a.loc[~df_a.index.duplicated(keep='first'), ~df_a.columns.isin(df_b.columns)]
>>> df_e = df_d.merge(df_c, "outer", left_index=True, right_index=True)
>>> df_e.sort_index(axis=1, inplace=True)

生成所需的数据帧(df_e):

>>> print(df_e)
     1  2    3
0  1.0  d  4.0
1  2.0  e  5.0
2  NaN  f  NaN
3  3.0  g  6.0

是否有更有效的方式到达df_e?我尝试了各种使用 pd.concatpd.mergepd.update 的方法,但我的努力导致了一个或多个这些不良后果:

  1. 它破坏了 df_a 的索引(即值没有相同的索引 - 某种索引创建发生在“幕后”)。
  2. 列已重命名。
  3. NaN 出现在 df_a 值应该出现的地方。

基本上,我要执行的操作是:

  1. df_b 的值更新 df_a
  2. 如果 df_b 中存在没有相应索引/列的值,请适当扩展 df_a 以包含这些值(保持索引/列以适当的顺序排列)。

编辑:提供了更好的例子,不是自然排序的。

最佳答案

我可以想到两种简单明了的方法来获取您的df_e;不过,我不会过多考虑列顺序。向 df_b 添加一个额外的第 4 列,只是为了显示 df_a 中不存在的列的行为:

In [63]: m = df_b.combine_first(df_a)

In [64]: m
Out[64]: 
     1  2    3   4
0  1.0  d  4.0  10
1  2.0  e  5.0  11
2  NaN  f  NaN  12
3  3.0  g  6.0  13

In [65]: a,b = df_a.align(df_b)

In [66]: a.update(b)

In [67]: a
Out[67]: 
     1  2    3     4
0  1.0  d  4.0  10.0
1  2.0  e  5.0  11.0
2  NaN  f  NaN  12.0
3  3.0  g  6.0  13.0

请注意对齐引入的 dtype 的细微差别。

关于python - Pandas :更新和合并数据框的更好方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48777128/

相关文章:

Python:继承内置类型

python - 与 Pandas 的加权相关系数

python - 如何对集合的可变大小部分求和?

python - 在 Flask Web 应用程序中正确从 Python 2 md5 库迁移到 Python 3 hashlib 以进行 CCAvenue 集成

python - 将情绪附加到数据框中的每个单词

python - 根据另一列中的值创建重复的递增序列

python - 如何将 os.DirEntry 对象与 pandas read_csv() 一起使用?

python - 访问对象存储器地址

python - 将 GPU 与 opencv-python 结合使用

design-patterns - python : subscriptable class