【问题标题】:Python. Merge unsorted Arrays (incomplete)Python。合并未排序的数组(不完整)
【发布时间】:2020-07-31 01:28:57
【问题描述】:

我有三个数组:

ID, Name, F1,
1, John, 21
5, Peter, 29
4, Don, 50

ID, F2
1, 40
5, 22

Name, F3
Don, 30
Peter, 66

我想将它们组合成一个数组:

ID, Name, F1, F2, F3
1, John, 21, 40, NaN
5, Peter, 29, 22, 66
4, Don, 50, NaN, 50

如何在 Python 中做到这一点? 我尝试使用字典,但没有成功。

代码:

A = np.array([[1, "John", 21], [5, "Peter", 29],[4, "Don", 50]])
B = np.array([[1, 40],[5, 22]])
C = np.array([["Don", 30],["Peter", 66]])

创建字典:

ID = A[:,0]
Name = A[:,1]
zipbObj = zip(ID, Name)
dictIDName = dict(zipbObj)

但现在我不知道如何以一般方式查看数组 B、C。

【问题讨论】:

  • 您能否提供您尝试解决问题的实际代码?请包含数组的原始数据结构,以便我们在尝试帮助您时对其进行初始化。

标签: python arrays dictionary merge


【解决方案1】:

使用pandas.merge_ordered:

pd.merge_ordered(pd.merge_ordered(df1, df2), df3)

举例

df1 = pd.DataFrame({'ID': [1,5,4],
                    'Name': ['John', 'Peter', 'Don'],
                    'F1': [21, 29, 50]})
df2 = pd.DataFrame({'ID': [1,5],
                    'F2': [40, 22]})
df3 = pd.DataFrame({'Name': ['Don', 'Peter'],
                    'F3': [30,66]})

print(pd.merge_ordered(pd.merge_ordered(df1, df2), df3))

结果:

   ID   Name  F1    F2    F3
0   4    Don  50   NaN  30.0
1   1   John  21  40.0   NaN
2   5  Peter  29  22.0  66.0

【讨论】:

    【解决方案2】:

    集合可用于执行数学集合运算,例如并集、交集、差集和对称差集。也许这个教程会有所帮助https://www.programiz.com/python-programming/set

    【讨论】:

      【解决方案3】:

      我准备了一个小函数可以做到这一点:

      #ID,Name,F1
      arr1=[[1,'Jhon',21],[5,'Peter',29],[4,'Don',29]]
      #ID,F2
      arr2=[[1,40],[5,22]]
      #Name,F3    
      arr3=[['Don',30],['Peter',66]]
      
      def merge_arrs(a1,a2,a3):
          res=[]
          dim=len(arr1)
          for i in range(0,dim):
              res.append([a1[i][0],a1[i][1],a1[i][2],None,None])
      
          for i in range(0,len(a2)):
              idx=-1
              for j in range(0,dim):
                  try:
                      a1[j].index(a2[i][0])
                      idx=j
                      break
                  except ValueError as ve:
                      continue
                  if(idx>=0):
                      res[idx][3]=a2[i][1]
      
          for i in range(0,len(a3)):
              idx=-1
              for j in range(0,dim):
                  try:
                      a1[j].index(a3[i][0])
                      idx=j
                      break
                  except ValueError as ve:
                      continue
                  if(idx>=0):
                      res[idx][4]=a2[i][1]
      
      
          return res
      
      print(merge_arrs(arr1,arr2,arr3))
      

      结果是:[[1, 'Jhon', 21, 40, None], [5, 'Peter', 29, 22, 22], [4, 'Don', 29, None, 40]]

      我希望这会有所帮助。祝你好运!

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-06-13
        • 2021-08-04
        • 2015-05-24
        • 2021-12-09
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        相关资源
        最近更新 更多