pandas:更新和合并数据帧的更好方法

2024-05-11 02:57:05 发布

您现在位置:Python中文网/ 问答频道 /正文

考虑两个数据帧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

以及以下代码:

^{pr2}$

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

^{3}$

有没有更有效的方法去df_e?我尝试过使用pd.concatpd.merge和{}的各种方法,但我的努力导致了一个或多个不良后果:

  1. 它会破坏df_a的索引(也就是说,这些值没有相同的索引-某种索引创建是“在幕后”发生的)。在
  2. 列被重命名。在
  3. nan出现在df_a值所在的位置。在

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

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

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


Tags: 数据方法代码fromdataframedfindexmerge
3条回答

阅读熊猫join和博客here和{a3}应该会对你有所帮助。在

来自博客:

“Left outer join produces a complete set of records from Table A, with the matching records (where available) in Table B. If there is no match, the right side will contain null.”

df_b.join(df_a, how='left', lsuffix='_b').drop('2', axis=1).rename(columns={'2_b': 2})

    2   1   3
0   d   1.0 4.0
1   e   2.0 5.0
2   f   NaN NaN
3   g   3.0 6.0

我可以想出两种简单的ish方法来获得您的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

或者

^{pr2}$

注意对齐所引入的数据类型的细微差别。在

这是一种方法:

df_b[[1, 3]] = df_a[[1, 3]]

结果:

^{pr2}$

相关问题 更多 >