【问题标题】:Merge DataFrames gives unexpected results合并 DataFrames 会产生意想不到的结果
【发布时间】:2019-04-05 16:13:03
【问题描述】:

我可能忽略了一个简单的数据问题,但在合并数据帧时无法获得所需的结果。 从here 列出的文档中工作,如果其中一个数据帧中不存在键值,我希望键列中的所有值都出现在与 NaN 值的合并结果中;

如果组合键没有出现在左侧或右侧 表,联接表中的值将为 NA

但是,我只获取我的数据的两个数据框中都存在的键的值。我正在使用外部并尝试向左(左侧是键列中具有更多值的数据框)。 当我使用示例数据(为这个问题创建)尝试它时,它似乎可以工作!

import pandas as pd import numpy as np

df1 = pd.DataFrame({'A': np.random.randint(0,10, size=(10,)),
                   'Time': np.random.randint(0,10, size=(10,))}) df1 = df1.sort_values('Time')

masterTime = [None]*len(df1) for x in range(len(df1)):
    masterTime[x] = x+1

df2 = pd.DataFrame({'Time': masterTime,
                    'B': np.random.randint(0,10,size=(10,))}) 
dfMerged = pd.merge(df1, df2,how='outer',on='Time') 
print(df1) 
print(df2) 
print(dfMerged)

这符合预期:

   A  Time
5  3     0
8  2     0
9  5     0
1  8     2
7  5     4
6  7     5
3  3     6
4  7     6
2  4     7
0  5     9
   Time  B
0     1  1
1     2  8
2     3  9
3     4  1
4     5  5
5     6  0
6     7  9
7     8  6
8     9  1
9    10  6
       A  Time    B
0   0.0     0  NaN
1   9.0     0  NaN
2   8.0     0  NaN
3   2.0     2  5.0
4   4.0     2  5.0
5   9.0     4  2.0
6   0.0     6  8.0
7   9.0     6  8.0
8   8.0     7  1.0
9   5.0     8  6.0
10  NaN     1  8.0
11  NaN     3  5.0
12  NaN     5  4.0
13  NaN     9  9.0
14  NaN    10  2.0

但是对于我的源数据,这给出了以下结果:

df1:

      Time              A              C
0        0      80.332192     136.548522
1        3     100.825094     201.764747
2        5      83.776422     157.963083
3        7      96.326057     207.776248
4        7      98.632962     139.496500
5        8     102.935885     147.342966
6        9      99.895678     167.848140
7       10      77.258792     131.287188
8       10      79.845595     135.395080
9       11      97.838232     192.865211
10      12      78.505035     149.080378

df2

      Time        B
0        1  1000.12
1        2  1000.12
2        3  1000.12
3        4  1000.12
4        5  1000.12
5        6  1000.12
6        7  1000.12
7        8  1000.12
8        9  1000.12
9       10  1000.12
10      11  1000.12
11      12  1000.12  

(两个数据框都这样继续)

将这些与 how='outer' 和 on='Time' 合并可以得到输出:

       Time              A              C        B
0         0      80.332192     136.548522      NaN
1         3     100.825094     201.764747  1000.12
2         5      83.776422     157.963083  1000.12
3         7      96.326057     207.776248  1000.12
4         7      98.632962     139.496500  1000.12
5         8     102.935885     147.342966  1000.12
6         9      99.895678     167.848140  1000.12
7        10      77.258792     131.287188  1000.12
8        10      79.845595     135.395080  1000.12
9        11      97.838232     192.865211  1000.12
10       12      78.505035     149.080378  1000.12

如您所见,这些只是 df1 的值。无论我尝试左、右、内还是外,它总是会给我这些(唯一的区别是它会给我或不会给我 0 值,具体取决于方法) 我希望是这样的(与上面的示例输出一致)

       Time              A              C        B
0         0      80.332192     136.548522      NaN
1         1            NaN            NaN  1000.12
2         2            NaN            NaN  1000.12
3         3     100.825094     201.764747  1000.12
4         4            NaN            NaN  1000.12
5         5      83.776422     157.963083  1000.12
6         6            NaN            NaN  1000.12 
7         7      96.326057     207.776248  1000.12
8         7      98.632962     139.496500  1000.12
9         8     102.935885     147.342966  1000.12
10        9      99.895678     167.848140  1000.12
11       10      77.258792     131.287188  1000.12
12       10      79.845595     135.395080  1000.12
13       11      97.838232     192.865211  1000.12
14       12      78.505035     149.080378  1000.12

两个数据框中的关键是“时间”,所以这也不是问题。 任何人都知道这里发生了什么?

【问题讨论】:

  • 您在问题中混合了不同的how(第一个示例使用right,第二个示例使用outer),请更新并保持一致。另外,请根据您的输入提交预期输出示例。
  • 我已经编辑了帖子并包含了我的预期结果
  • 您的预期结果与您输入的数据不匹配。例如:Time 是 12 时,B 应该是 NaN。
  • 我已经编辑了我的问题并为时间为 12 添加了一行,因为这是一个具有 9000 个值或其他内容的数据框(对于时间 1-9000,增量为 1,因此所有整数都在有时间)
  • 好的,然后pd.merge(df1, df2, how="outer", on="Time") 给我你的预期输出。

标签: python pandas dataframe merge


【解决方案1】:

我觉得很愚蠢,但这与排序有关。它一直按预期工作,但我未能正确排序“时间”上的合并数据帧,因此在打印合并数据帧时未显示初始帧中的时间值的行。 对打印中的合并帧进行排序显示了预期的输出

print(dfMerged.sort_values('Time'))

【讨论】:

    猜你喜欢
    • 2012-01-05
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多