当前位置: 首页 > 知识库问答 >
问题:

基于另一个数据帧在数据帧的特定位置插入多列

胥宏义
2023-03-14

我正面临这个问题,其中我有一个数据帧,比如df1:

>>> df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9), columns = ['A1','B1', 'C1', 
                                                       'A2', 'B2', 'C2','A3','B3','C3'])
>>> df1

   A1  B1  C1  A2  B2  C2  A3  B3  C3
0   0   1   2   3   4   5   6   7   8
1   9  10  11  12  13  14  15  16  17
2  18  19  20  21  22  23  24  25  26
3  27  28  29  30  31  32  33  34  35
4  36  37  38  39  40  41  42  43  44

和另一个数据帧df2:

>>> df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['AB1','AB2','AB3'])
>>> df2

   AB1  AB2  AB3
0    0    1    2
1    3    4    5
2    6    7    8
3    9   10   11
4   12   13   14

现在我想要的是,将df2的列插入到df1的特定位置,这样df1就变成了(实际上一个新的df也会起作用):

>>> df1

   A1  AB1  B1  C1  A2  AB2  B2  C2  A3  AB3  B3  C3
0   0    0   1   2   3    1   4   5   6    2   7   8
1   9    3  10  11  12    4  13  14  15    5  16  17
2  18    6  19  20  21    7  22  23  24    8  25  26
3  27    9  28  29  30   10  31  32  33   11  34  35
4  36   12  37  38  39   13  40  41  42   14  43  44

我现在通过创建一个新的空df来实现这一点,然后迭代这两个df的列,然后依次添加每一列。这是低效的、丑陋的,并且违背了数据流的全部目的。所以我很想知道,这个已经有方法了吗?我不确定这样的问题是否已经在这里得到了回答,但我肯定我没有找到任何结果。如果这是以前讨论过的,如果有人指给我看,我会很高兴。

共有1个答案

步胜
2023-03-14

您可以使用concat,然后使用sorted by multiple attributes和change order by new value subset-[]:

df = pd.concat([df1, df2], axis=1)
cols = sorted(df.columns, key = lambda x: (x[-1], x[:-1]))   
print (cols)
['A1', 'AB1', 'B1', 'C1', 'A2', 'AB2', 'B2', 'C2', 'A3', 'AB3', 'B3', 'C3']

df = df[cols]
print (df)
   A1  AB1  B1  C1  A2  AB2  B2  C2  A3  AB3  B3  C3
0   0    0   1   2   3    1   4   5   6    2   7   8
1   9    3  10  11  12    4  13  14  15    5  16  17
2  18    6  19  20  21    7  22  23  24    8  25  26
3  27    9  28  29  30   10  31  32  33   11  34  35
4  36   12  37  38  39   13  40  41  42   14  43  44

另一个想法是在列中创建多索引并按第二级排序,最后按映射多索引放平:

df1.columns = [df1.columns.str[:1], df1.columns.str[1]]
df2.columns = [df2.columns.str[:2], df2.columns.str[2]]

df = pd.concat([df1, df2],axis=1).sort_index(axis=1, level=1)
df.columns = df.columns.map(''.join)
print (df)
   A1  AB1  B1  C1  A2  AB2  B2  C2  A3  AB3  B3  C3
0   0    0   1   2   3    1   4   5   6    2   7   8
1   9    3  10  11  12    4  13  14  15    5  16  17
2  18    6  19  20  21    7  22  23  24    8  25  26
3  27    9  28  29  30   10  31  32  33   11  34  35
4  36   12  37  38  39   13  40  41  42   14  43  44 

编辑:

有关更一般的解决方案,可以使用dataframe.reindexmultiindex.from_product:

df1 = pd.DataFrame(data = np.arange(45).reshape(-1,9), 
                   columns = ['A1','B1', 'C1', 'A2', 'B2', 'C2','A3','B3','C3'])
df2 = pd.DataFrame(data = np.arange(15).reshape(-1,3), columns = ['Sum1','Sum2','Sum3'])


#change order of values in MultiIndex
df1.columns = [df1.columns.str[1], df1.columns.str[:1]]
df2.columns = [df2.columns.str[3], df2.columns.str[:3]]

mux = pd.MultiIndex.from_product([['1','2','3'], ['A','Sum','B','C']])
print (mux)
MultiIndex([('1',   'A'),
            ('1', 'Sum'),
            ('1',   'B'),
            ('1',   'C'),
            ('2',   'A'),
            ('2', 'Sum'),
            ('2',   'B'),
            ('2',   'C'),
            ('3',   'A'),
            ('3', 'Sum'),
            ('3',   'B'),
            ('3',   'C')],
           )

df = pd.concat([df1, df2], axis=1).reindex(columns=mux)
df.columns = [f'{b}{a}' for a, b in df.columns]
print (df)
   A1  Sum1  B1  C1  A2  Sum2  B2  C2  A3  Sum3  B3  C3
0   0     0   1   2   3     1   4   5   6     2   7   8
1   9     3  10  11  12     4  13  14  15     5  16  17
2  18     6  19  20  21     7  22  23  24     8  25  26
3  27     9  28  29  30    10  31  32  33    11  34  35
4  36    12  37  38  39    13  40  41  42    14  43  44
 类似资料:
  • 我有两个数据帧df1和df2。df1就像一个具有以下值的字典 df2具有以下值: 我想基于df1数据帧中的,将df2拆分为3个新的数据帧。 日期,TLRA_权益栏应位于数据框 预期产出: > 数据帧 消费者,非周期性数据帧 请让我知道如何有效地做。我想做的是连接列名,例如,然后根据列名的前半部分分割数据帧。 代码: 但这很复杂。需要更好的解决方案。

  • 我有两个数据帧df1和df2 df1如下 df2就像 我想根据df2中与df1中的列名匹配的单元格值将值从df1复制到df2,所以我的df3应该看起来像 df3 基本上,我想根据df2的单元格值(df1中的列名)从df1复制df2中的列 如果它仍然令人困惑,请告诉我

  • 我有两个实体:矩阵和数据帧。矩阵在所有单元格中都有数字。第二个数据帧在几个单元格中有NA。如何确保第一个矩阵的NA与后一个数据帧中的NA处于相同的精确位置。 我试着完成。case()和na。省略,但不幸的是,这将一起删除行。我尝试了一个for循环,它先按列迭代,然后按行迭代,检查单元格的位置是否为零,并返回位置,然后将该位置反馈到indp数据帧中-得到一些关于维度的错误: 贯穿我的逻辑。这将一次迭

  • 我有一个关于熊猫以及正确索引和替换值的问题。 我有两个数据帧,df1和df2,具有相同的列(Col1、Col2、Col3和Col4)。 在df1中,我想用另一个值(比如100)替换与df2中其他列(Col1、Col2和Col3)的值匹配的行中Col4中的值。 生成的df1看起来像这样: 我试过这样的方法: 但是我得到了错误,我不确定这是否达到了我想要的。

  • 用其他dataframe的列值替换dataframe的一列中的nan值时出现问题。下面是一个测试示例: 我想用其他dataframe中的特定值替换列名中的Nan值(如果其中有一些Nan值,则不是其他列),例如此dataframe中的Name2值: 我想得到的是: 这是此示例的测试代码: 然后我尝试了这三种方法,但都不起作用——我的数据帧始终保持Nan值。 你能告诉我哪里出错了吗?

  • 我有两个数据框,都包含英文和中文单词字符串,我想知道其中一个是另一个的子集: