【问题标题】:How do i perform join on 2 dataframes that have same number of rows but no matching column names?如何对具有相同行数但没有匹配列名的 2 个数据帧执行连接?
【发布时间】:2019-12-28 00:35:33
【问题描述】:

我正在尝试为数据框的所有特征中缺失的 NaN 值绘制直方图 为此,我为缺少 NaN 值创建了一个数据框

缺失值数据框

   0
-----
0  0
1  14
2  800
.
.
84 2344

然后我有这个主数据框,它有多个我不关心的列,因为我只想要这个数据框中的行名

主数据框

     0  1
---------
F1   3  3
F2   4  3
.
.
F85  5  2

我如何合并/连接这 2 个数据帧,最终输出应该是这样的(主数据帧中的列无关紧要,因为我想绘制所有特征中缺失值的数量,即 F1、F2、...F85)

    F1   0  
    F2   14 
    F3   800
    .
    .
    F85  2344

【问题讨论】:

  • 我看不到任何东西是如何在输出中合并/连接的
  • @yatu 第一列似乎来自第二个数据框(我假设它的索引)。尽管您可以尝试稍微改进一下格式,以便更容易理解和复制 Shalin。
  • 当然@CeliusStingher,重新格式化。希望它现在清晰可见..正确,a)数据帧2中的特征(在这种情况下为行)b)在数据帧1中确定和显示的缺失值需要显示在合并的数据帧中。最后,我将转置合并数据框以使用 F1,F2,...F85 绘制直方图,这将是我转置后的列。希望这是有道理的
  • 您的意思是您希望结果数据帧具有来自第二个数据帧(主)的索引和来自第一个数据帧(缺失值数据帧)的值?换句话说,您想按行号加入,对吧?
  • 是的,但是如您所见,两个数据框中的行名没有共同点。所以基本上,我想将数据帧 1 叠加在数据帧 2 上,因此缺失值数字逐行对应于合并数据帧中的行名(F1,F2...F85)。这可能吗?

标签: python pandas dataframe data-science concat


【解决方案1】:

假设您的数据框是df1(缺失值数据框)和df2(主数据框)。然后你可以试试这个:

df1.columns=['X']
res = df2.reset_index().join(df1.reset_index(), rsuffix='_r')[['index', 'X']].set_index('index')
print(res)

结果将是:

index      
F1        0
F2       14
F3      800
...
F85    2344

想法是使用reset_index将两个数据帧中的索引替换为行号,然后合并数据帧

【讨论】:

  • 工作得很好@Stepan ..只是一件事..我在我的问题前面犯了一个错误..数据框1的列索引是'0'而不是'X',其中0是默认值索引分配..这就是我执行您提供的步骤时的原因,它拾取映射到数据框 2 的列索引“0”而不是数据框 1 的行值。我试图将数据框 1 中的列名重命名为不同的名称,所以你的解决方案有效,但重命名没有成功。有什么见解吗?
  • 您可以在res=...之前添加df1.columns=['X']。我会更新答案
  • 这对 Stepan 有效。非常感谢。不能赞成你的回答,因为我还没有那么高的声誉,但这很好地解决了我的问题..
  • 完成@Stepan ..我删除了索引名称,现在只有一个与缺失值关联的列名..有没有办法可以用 F1,F2 绘制直方图... x 轴上的 F85 值和 y 轴上的缺失值(由列名表示)?可以根据上面答案中生成的输出来完成吗?或者我需要将列名添加到 F1,F2..F85 表示的列中?
【解决方案2】:

IIUC 您希望水平合并 2 个数据帧,而不管具有相同行数、不同列和索引的索引。仅从其中的一些列中选择一些列。

import pandas as pd

df1=pd.DataFrame(index=[1,2,3], data={"a": [3,6,4]})

df2=pd.DataFrame(index=["a1","v2","x"], data={"x": [-3,136,-5], "y": ["x", "y", "c"]})

df3=pd.concat([df1.reset_index(drop=True), df2["x"].to_frame().reset_index(drop=True)], axis=1, ignore_index=False)

输入:

#df1
   a
1  3
2  6
3  4
#df2
      x  y
a1   -3  x
v2  136  y
x    -5  c

输出:

#df3
   a    x
0  3   -3
1  6  136
2  4   -5

【讨论】:

  • 谢谢@Grzegorz,Skibinski - 但我希望从 df2 中提取行名。下面 stepan 共享的解决方案解决了我的目的
  • 那很好,然后请将@Stepan 解决方案标记为答案 ;)
【解决方案3】:

我们可以通过使用pandasconcat 方法轻松做到这一点。

`

df1 = pd.DataFrame({'A': ['A0', 'A1', 'A2', 'A3'],
                    'B': ['B0', 'B1', 'B2', 'B3'],
                    'C': ['C0', 'C1', 'C2', 'C3'],
                    'D': ['D0', 'D1', 'D2', 'D3']},
                   index=[0, 1, 2, 3])

df4 = pd.DataFrame({'B': ['B2', 'B3', 'B6', 'B7'],
                    'D': ['D2', 'D3', 'D6', 'D7'],
                    'F': ['F2', 'F3', 'F6', 'F7']},
                   index=[0, 1, 2, 3])

result = pd.concat([df1, df4], axis=1, sort=False)

`

您将根据您的要求获得确切的价值。

【讨论】:

  • 对不起,如果不清楚..我做了一些编辑..没有匹配的列,这就是为什么我不能简单地做一个 concat
  • 您可以更改上面代码中的列名,而不是获得确切的输出。
  • 我明白了,但即便如此,它仍然会在匹配的行名(而不是行号)上连接,这不是我的问题。如果您看到下面涉及 reset_index 的 Stepan 解决方案,它解决了目的..
  • 在上面的答案中你必须导入pandas库然后它会解决问题
  • 当然是 Vijayant。熊猫库需要导入,但我的意思是要求不同..如果您查看我最初的问题和 Stepan 提供的解决方案,这不是简单的连接...请再看一遍..您的解决方案会在匹配的列上进行内部连接,这不是问题
猜你喜欢
  • 2020-01-06
  • 2017-09-16
  • 1970-01-01
  • 1970-01-01
  • 2016-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-05
相关资源
最近更新 更多