【问题标题】:How to insert n DataFrame to another every nth row in Pandas?如何在 Pandas 中每隔 n 行将 n 个 DataFrame 插入另一个?
【发布时间】:2017-08-02 02:46:45
【问题描述】:

例如,我有一个DataFrame A,如下所示

A
0
1
2

现在我想将DataFrame B中的每2行插入A每1行,B如下

B
3
3
4
4
5
5

我终于想要了

A
0
3
3
1
4
4
2
5
5

我怎样才能做到这一点?

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    一种选择是获取每个数据框的值,重新整形,与np.hstack 连接,然后分配给一个新的数据框。

    In [533]: pd.DataFrame(np.hstack((df1.A.values.reshape(-1, 1),\
                                      df2.B.values.reshape(-1, 2))).reshape(-1, ),\
                           columns=['A'])
    Out[533]: 
       A
    0  0
    1  3
    2  3
    3  1
    4  4
    5  4
    6  2
    7  5
    8  5
    

    pd.concatdf.stack 的另一种解决方案:

    In [622]: pd.DataFrame(pd.concat([df1.A, pd.DataFrame(df2.B.values.reshape(-1, 2))], axis=1)\
                                 .stack().reset_index(drop=True),\
                          columns=['A'])
    Out[622]: 
       A
    0  0
    1  3
    2  3
    3  1
    4  4
    5  4
    6  2
    7  5
    8  5
    

    【讨论】:

    • 感谢您的回复,有没有 Pandas 的内置方法可以做到这一点?
    • @danche 你想要的是非常小众的。存在pd.concat,但不能任意交织系列。
    • 或者可以考虑reset_index
    • @Wen 可以吗?
    • 我在试试~
    【解决方案2】:

    设置
    考虑数据框ab

    a = pd.DataFrame(dict(A=range(3)))
    b = pd.DataFrame(dict(B=np.arange(3).repeat(2) + 3))
    

    解决方案
    使用interleave 来自toolzcytoolz
    诀窍是将b 拆分为interleave 的两个参数

    from cytoolz import interleave
    
    pd.Series(list(interleave([a.A, b.B[::2], b.B[1::2]])))
    
    0    0
    1    3
    2    3
    3    1
    4    4
    5    4
    6    2
    7    5
    8    5
    dtype: int64
    

    这是将@root's answer 修改为my question

    【讨论】:

    • 又是 cytoolz。
    【解决方案3】:

    也许这个?

    A=len(df1)+len(df2)
    df1.index=(list(range(0, A,3)))
    df2.index=list(set(range(0, A))-set(range(0, A,3)))
    df2.columns=['A']
    df=pd.concat([df1,df2],axis=0).sort_index()
    
    df
    Out[188]: 
       A
    0  0
    1  3
    2  3
    3  1
    4  4
    5  4
    6  2
    7  5
    8  5
    

    【讨论】:

    • 漂亮又有创意!
    • @cᴏʟᴅsᴘᴇᴇᴅ 谢谢~但它并不整洁......,你的答案还是要好得多~
    • 不错的答案 +1 (-:
    • @piRSquared 你的更好~
    【解决方案4】:

    如果我们首先将 a 拆分为 len(a) 数组,将 b 拆分为 len(b) 两个数组,我们可以将它们压缩在一起,堆叠并连接。

    a = np.split(dfa.A.values,len(dfa.A))
    b = np.split(dfb.B.values,len(dfb.B)/2)
    
    c = np.concatenate(np.hstack(list(zip(a,b))))
    
    pd.Series(c)
    

    返回:

    0    0
    1    3
    2    3
    3    1
    4    4
    5    4
    6    2
    7    5
    8    5
    dtype: int64
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-10
      • 2019-11-05
      • 1970-01-01
      • 2021-04-22
      • 1970-01-01
      • 1970-01-01
      • 2023-03-29
      • 1970-01-01
      相关资源
      最近更新 更多