使用Python(高效地)在另一个数据帧内复制数据帧内容

使用Python(高效地)在另一个数据帧内复制数据帧内容,python,pandas,dataframe,copy,Python,Pandas,Dataframe,Copy,我有一个数据帧(df1): 然后我创建一个新的数据帧(df2),它的行数是fd1的两倍。我的目标是以一种智能的方式将第一个数据帧中的一些元素复制到第二个数据帧中,以使结果如下所示: 到目前为止,我通过使用以下命令实现了这一目标: raw_data = {'A': ['pinco', 'pallo', 'pollo'], 'B': ['lollo', 'fallo', 'gollo'], 'C': ['pizzo', 'pazzo', 'ra

我有一个数据帧(
df1
):

然后我创建一个新的数据帧(
df2
),它的行数是
fd1
的两倍。我的目标是以一种智能的方式将第一个数据帧中的一些元素复制到第二个数据帧中,以使结果如下所示:

到目前为止,我通过使用以下命令实现了这一目标:

raw_data = {'A': ['pinco', 'pallo', 'pollo'], 
            'B': ['lollo', 'fallo', 'gollo'], 
            'C': ['pizzo', 'pazzo', 'razzo']}
df1 = pd.DataFrame(raw_data, columns = ['A', 'B', 'C'])
columns = ['XXX','YYY', 'ZZZ']
N = 3
df2 = pd.DataFrame(columns=columns,index=range(N*2))

idx = 0
for i in range(N):
    df2['XXX'].loc[idx] = df1['A'].loc[i]
    df2['XXX'].loc[idx+1] = df1['A'].loc[i]
    df2['YYY'].loc[idx] = df1['B'].loc[i]
    df2['YYY'].loc[idx+1] = df1['C'].loc[i]
    idx += 2
然而,我正在寻找一种更有效(更紧凑、更优雅)的方法来获得这个结果。我尝试在for循环中使用以下组合,但没有成功:

df2[['XXX','YYY']].loc[idx] = df1[['A', 'B']].loc[i]
df2[['XXX','YYY']].loc[idx+1] = df1[['A', 'C']].loc[i]

你可以这样做:

df2['XXX'] = np.repeat(df1['A'].values, 2)   # Repeat elements in A twice
df2.loc[::2, 'YYY'] = df1['B'].values        # Fill even rows with B values
df2.loc[1::2, 'YYY'] = df1['C'].values       # Fill odd rows with C values

     XXX    YYY  ZZZ
0  pinco  lollo  NaN
1  pinco  pizzo  NaN
2  pallo  fallo  NaN
3  pallo  pazzo  NaN
4  pollo  gollo  NaN
5  pollo  razzo  NaN

根据Nickil Maveli的答案,如果你先将B和C交织到一个数组中,会有一个更快的解决方案

在我的机器上大约有3倍的加速

In [110]: %timeit df2.loc[::2, 'YYY'] = df1['B'].values; df2.loc[::2, 'YYY'] = df1['C'].values
1000 loops, best of 3: 274 µs per loop

In [111]: %timeit df2['YYY'] = np.dstack((df1['B'].values, df1['C'].values)).ravel()
10000 loops, best of 3: 87.5 µs per loop

就速度而言,这绝对是一个更好的方法。
In [110]: %timeit df2.loc[::2, 'YYY'] = df1['B'].values; df2.loc[::2, 'YYY'] = df1['C'].values
1000 loops, best of 3: 274 µs per loop

In [111]: %timeit df2['YYY'] = np.dstack((df1['B'].values, df1['C'].values)).ravel()
10000 loops, best of 3: 87.5 µs per loop