【问题标题】:How to expand values in a dataframe from another dataframe [duplicate]如何从另一个数据框中扩展数据框中的值[重复]
【发布时间】:2020-10-10 18:32:43
【问题描述】:

例如,考虑两个数据帧 A 和 B

数据框 A:

Name1 | Col1 | Col2
------+------+-----
 A    |  1   | 2
 B    |  4   | 3
 C    |  6   | 8 

和数据框 B:

Name2 | Col3 | Col4
------+------+-----
 P    |  5   |  9
 Q    |  0   |  1
 R    |  2   |  7

我希望将它们转换成一个数据框,例如

新数据框:

Name1 | Col1 | Col2 | Name2 | Col3 | Col4
------+------+------+-------+------+------
 A    |  1   |  2   |  P    |  5   | 9
 A    |  1   |  2   |  Q    |  0   | 1
 A    |  1   |  2   |  R    |  2   | 7
 B    |  4   |  3   |  P    |  5   | 9
 B    |  4   |  3   |  Q    |  0   | 1
 B    |  4   |  3   |  R    |  2   | 7
 C    |  6   |  8   |  P    |  5   | 9
 C    |  6   |  8   |  Q    |  0   | 1
 C    |  6   |  8   |  R    |  2   | 7

我怎样才能改变它?

【问题讨论】:

  • 这是什么逻辑?知道这会很有帮助。
  • 嗯,我需要做这件事来准备我为我的 ML 模型 @ShubhamSharma 建立的数据。
  • 但是为什么key只复制了3次,这里应该有一些逻辑吧?
  • @ShubhamSharma 这个名字实际上代表了 github 提交哈希和文件。这很复杂,但正如我所说,这一切都将用于 ML 模型
  • 哦,笛卡尔积!!!这就是我要找的词。我想是的,这正是我想要的。谢谢人

标签: python python-3.x pandas dataframe


【解决方案1】:
df1['key'] = 0
df2['key'] = 0
new_df = pd.merge(df1, df2, on='key').drop('key', axis=1)
print(new_df)

打印:

  Name1  Col1  Col2 Name2  Col3  Col4
0     A     1     2     P     5     9
1     A     1     2     Q     0     1
2     A     1     2     R     2     7
3     B     4     3     P     5     9
4     B     4     3     Q     0     1
5     B     4     3     R     2     7
6     C     6     8     P     5     9
7     C     6     8     Q     0     1
8     C     6     8     R     2     7

【讨论】:

    【解决方案2】:

    你可以做的是这样的

    A2 = A.copy()
    B2 = B.copy()
    
    DUMMY = 'dummy'
    A2[DUMMY] = 1
    B2[DUMMY] = 1
    
    df = pd.merge(A2,B2)
    df = df.loc[:,df.columns != DUMMY]
    

    它起作用的原因是在它们匹配的所有值的公共“虚拟”列上合并连接。假设 dummy 是常数,所有的组合都匹配。

    【讨论】:

      【解决方案3】:

      这是一个使用 numpy 进行数据转换的答案,基本思想是复制 df1 中的行与 df2 中的行一样多次。

      n_cols = df1.shape[1]
      vals = [np.hstack([np.repeat(df1.iloc[i,:], n_cols).values.reshape(-1, n_cols), df2.values]) 
              for i in range(len(df1))]
      f = pd.DataFrame(np.vstack(vals), columns=df1.columns.tolist() + df2.columns.tolist())
      
      print(f)
      
        Name1 Col1 Col2 Name2 Col3 Col4
      0     A    A    A     P    5    9
      1     1    1    1     Q    0    1
      2     2    2    2     R    2    7
      3     B    B    B     P    5    9
      4     4    4    4     Q    0    1
      5     3    3    3     R    2    7
      6     C    C    C     P    5    9
      7     6    6    6     Q    0    1
      8     8    8    8     R    2    7
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-24
        • 2021-07-27
        • 1970-01-01
        • 2019-03-14
        • 1970-01-01
        相关资源
        最近更新 更多