【问题标题】:How to merge the two columns from two dataframe into one column of a new dataframe (pandas)?如何将两个数据框的两列合并到一个新数据框(熊猫)的一列中?
【发布时间】:2017-08-02 23:39:22
【问题描述】:

我想将 pandas 数据框的两列不同列的值合并到新数据框的一列中。

pandas df1 =         

        hapX
  pos   0.0
1 721   0.2
2 735   0.5
3 739   1.0


pandas df2 =       

        hapY
  pos   0.1
1 721   0.0
2 735   0.6
3 739   1.5

我想生成一个新的数据框,例如:

  df_joined['hapX|Y'] = df1.astype(str).add('|').add(df2.astype(str))

预期输出

        hapX|Y
  pos   0.0|0.1
1 721   0.2|0.0
2 735   0.5|0.6
3 739   1.0|1.5

但是,这是输出一堆NaN

        hapX    hapY
  pos   NaN      NaN
1 721   NaN      NaN
2 735   NaN      NaN
3 739   NaN      NaN

价值是浮动的问题吗(我不这么认为)。我的方法有什么问题?

另外,如果列值在一个数据帧中类似于 hapX1 hapX1 hapX3 而在另一个数据帧中是 hapY1 hapY2 hapY3,是否有办法自动执行该过程?

谢谢,

【问题讨论】:

  • df1.hapX.astype(str) + '|' + df2.pahY.astype(str) 只会为您提供一个可以添加到数据框中的新列。
  • 实际上这不起作用并抛出attribute error
  • 索引都一样吗?
  • 是的,pos 索引是相同的。但是,正如您在问题中看到的那样,column 索引是不同的。

标签: python pandas dataframe merge nan


【解决方案1】:

您可以合并两个数据框,然后连接 hapX 和 hapY。 假设您的第一列名称是 no。

df_joined = df1.merge(df2, on = 'no')
df_joined['hapX|Y'] = (df_joined['hapX'].astype(str))+'|'+(df_joined['hapY'].astype(str))
df_joined.drop(['hapX', 'hapY'], axis = 1)

这给了你

    no  hapX|Y
0   pos 0.0|0.1
1   721 0.2|0.0
2   735 0.5|0.6
3   739 1.0|1.5

【讨论】:

  • 什么是on='no'。我收到KeyError: 'no'
  • @everestial007 认真的吗?就是第二句,说你的第一列名是no
  • 我使用 df1 = pd.DataFrame({'no': ['pos', 721, 735, 739], 'hapX': [0.0, 0.2, 0.5, 1.0]} ) 因为我无法使用 read_clipboard() 重现您的 df。您可以使用 df.columns 命名列
【解决方案2】:

只是添加到前面的答案,对于 N DataFrames 的一般情况,

假设你有如下多个 DataFrame:

dfs = [pd.DataFrame({'hapY'+str(j): [random.random() for i in range(10)]}) for j in range(5)]

这样

>>> dfs[0]
      hapY0
0  0.175683
1  0.353729
2  0.949848
3  0.346088
4  0.435292
5  0.837879
6  0.277274
7  0.623121
8  0.325119
9  0.709252

那么,

>>> map( lambda m: '|'.join(m) , zip(*[ dfs[j]['hapY'+str(j)].astype(str)  for j in range(5)]))
['0.0845464936138|0.193336164837|0.551717121013|0.113566029656|0.479590342798',
 '0.275851474238|0.694161791339|0.151607726092|0.615367668451|0.498997567849',
 '0.116891472119|0.258406028668|0.315137581816|0.819992354178|0.864412473301',
 '0.729581942312|0.614902776003|0.443986436146|0.227782256619|0.0149481683863',
 '0.745583477173|0.441456815889|0.428691631831|0.307480112319|0.136790112739',
 '0.981337451224|0.0117895017035|0.415140979617|0.650957722911|0.968082350568',
 '0.725618728314|0.0546057041356|0.715910454674|0.0828229441557|0.220878025678',
 '0.704047455894|0.303403129266|0.0499082759635|0.49727194707|0.251623048104',
 '0.453595354131|0.146042134766|0.346665276655|0.911092176243|0.291405609407',
 '0.140523603089|0.117930249858|0.902071673051|0.0804933425857|0.876006332635']

您可以稍后将其放入 DataFrame 中。

【讨论】:

    【解决方案3】:

    我认为最简单的方法是通过dict 重命名列,这可以由dict comprehension 创建,最后是add_suffix

    print (df1) 
         hapX1  hapX2  hapX3  hapX4
    pos                            
    23     1.0    0.0    1.0    1.0
    24     1.0    1.0    1.5    1.0
    28     1.0    0.0    0.5    0.0
    
    print (df2)
         hapY1  hapY2  hapY3  hapY4
    pos                            
    23     0.0    1.0    0.5    0.0
    24     1.0    1.0    1.5    1.0
    28     0.0    1.0    1.0    1.0
    
    d = {'hapY' + str(x):'hapX' + str(x) for x in range(1,5)}
    print (d)
    {'hapY1': 'hapX1', 'hapY3': 'hapX3', 'hapY2': 'hapX2', 'hapY4': 'hapX4'}
    
    df_joined = df1.astype(str).add('|').add(df2.rename(columns=d).astype(str)).add_suffix('|Y')
    print (df_joined) 
    
         hapX1|Y  hapX2|Y  hapX3|Y  hapX4|Y
    pos                                    
    23   1.0|0.0  0.0|1.0  1.0|0.5  1.0|0.0
    24   1.0|1.0  1.0|1.0  1.5|1.5  1.0|1.0
    28   1.0|0.0  0.0|1.0  0.5|1.0  0.0|1.0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 2018-12-18
      • 2017-11-26
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2018-07-22
      相关资源
      最近更新 更多