ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python-用单个行连接两个数据框熊猫

2019-10-25 19:56:12  阅读:217  来源: 互联网

标签:pandas concatenation python


我有一个数据框df看起来像:

   one  three  two
0  1.0   10.0  4.0
1  2.0    3.0  3.0
2  3.0   22.0  2.0
3  4.0    1.0  1.0

我还有另一个单行数据框df2,如下所示:

     a    b    m    u
0  1.0  2.0  1.0  4.0

我想将两者连接起来,最后得到:

   one  three  two    a    b    m    u
0  1.0   10.0  4.0  1.0  2.0  1.0  4.0
1  2.0    3.0  3.0  1.0  2.0  1.0  4.0
2  3.0   22.0  2.0  1.0  2.0  1.0  4.0
3  4.0    1.0  1.0  1.0  2.0  1.0  4.0

我试过了:

df3 = pd.concat([df, df2], axis=1, ignore_index=True)

     0     1    2    3    4    5    6
0  1.0  10.0  4.0  1.0  2.0  1.0  4.0
1  2.0   3.0  3.0  NaN  NaN  NaN  NaN
2  3.0  22.0  2.0  NaN  NaN  NaN  NaN
3  4.0   1.0  1.0  NaN  NaN  NaN  NaN

错误答案…

我该如何解决呢?

非常感谢.

解决方法:

我认为您可以将numpy.tile用于重复数据:

df2 = pd.DataFrame(np.tile(df2.values, len(df.index)).reshape(-1,len(df2.columns)), 
                   columns=df2.columns)
print (df2)
     a    b    m    u
0  1.0  2.0  1.0  4.0
1  1.0  2.0  1.0  4.0
2  1.0  2.0  1.0  4.0
3  1.0  2.0  1.0  4.0

df3 = df.join(df2)
print (df3)
   one  three  two    a    b    m    u
0  1.0   10.0  4.0  1.0  2.0  1.0  4.0
1  2.0    3.0  3.0  1.0  2.0  1.0  4.0
2  3.0   22.0  2.0  1.0  2.0  1.0  4.0
3  4.0    1.0  1.0  1.0  2.0  1.0  4.0

或改进了John Galt solution-仅替换了df2列的NaN:

df3 = df.join(df2)
df3[df2.columns] = df3[df2.columns].ffill()
print (df3)
   one  three  two    a    b    m    u
0  1.0   10.0  4.0  1.0  2.0  1.0  4.0
1  2.0    3.0  3.0  1.0  2.0  1.0  4.0
2  3.0   22.0  2.0  1.0  2.0  1.0  4.0
3  4.0    1.0  1.0  1.0  2.0  1.0  4.0

由iloc创建的assign by Series的另一种解决方案,但列名称必须为字符串:

df3 = df.assign(**df2.iloc[0])
print (df3)
   one  three  two    a    b    m    u
0  1.0   10.0  4.0  1.0  2.0  1.0  4.0
1  2.0    3.0  3.0  1.0  2.0  1.0  4.0
2  3.0   22.0  2.0  1.0  2.0  1.0  4.0
3  4.0    1.0  1.0  1.0  2.0  1.0  4.0

时间:

np.random.seed(44)
N = 1000000

df = pd.DataFrame(np.random.random((N,5)), columns=list('ABCDE'))

df2 = pd.DataFrame(np.random.random((1, 50)))
df2.columns = 'a' + df2.columns.astype(str)


In [369]: %timeit df.join(pd.DataFrame(np.tile(df2.values, len(df.index)).reshape(-1,len(df2.columns)), columns=df2.columns))
1 loop, best of 3: 897 ms per loop

In [370]: %timeit df.assign(**df2.iloc[0])
1 loop, best of 3: 467 ms per loop

In [371]: %timeit df.assign(key=1).merge(df2.assign(key=1), on='key').drop('key',axis=1)
1 loop, best of 3: 1.55 s per loop

In [372]: %%timeit
     ...: df3 = df.join(df2)
     ...: df3[df2.columns] = df3[df2.columns].ffill()
     ...: 
1 loop, best of 3: 1.9 s per loop

标签:pandas,concatenation,python
来源: https://codeday.me/bug/20191025/1931158.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有