Python 我想通过在数据框中添加两个连续列来插入新列

Python 我想通过在数据框中添加两个连续列来插入新列,python,pandas,Python,Pandas,我有一个包含大量列和重复模式的数据框。我喜欢在每个模式之间插入一列(Diff),这样该列就包含了前面列的差异。也许我可以用一个例子来更好地描述它: Existing DF Example: A_x_y_z_1 A_x_y_z_2 B_a_b_c_1 B_a_b_c_2 C_3_y_w_1 C_3_y_w_2 2 1 7 1 2 3 5 5

我有一个包含大量列和重复模式的数据框。我喜欢在每个模式之间插入一列(Diff),这样该列就包含了前面列的差异。也许我可以用一个例子来更好地描述它:

Existing DF Example:

A_x_y_z_1  A_x_y_z_2  B_a_b_c_1  B_a_b_c_2  C_3_y_w_1  C_3_y_w_2
 2             1          7          1          2          3  
 5             5          9          5          1          4 
 1             3          1          3          2          2
 3             8          0          2          3          1

Expected DF:

A_x_y_z_1   A_x_y_z_2   diff  B_a_b_c_1   B_a_b_c_2   diff   C_3_y_w_1   C_3_y_w_2   diff
 2             1        -1        7           1        -6        2           3         1  
 5             5         0        9           5        -4        4           5         1 
 1             3         2        1           3         2        2           7         5
 3             8         5        0           2         2        1           4         3


我们可以使用列进行
split
,然后获得
groupby
diff

df1=df.copy()
df1.columns=df1.columns.str.split('_').str[0]
df=pd.concat([df,df1.groupby(level=0,axis=1).diff().dropna(1).add_suffix('_Diff')],1).sort_index(axis=1)
df
Out[115]: 
   A_1  A_2  A_Diff  B_1  B_2  B_Diff  C_1  C_2  C_Diff
0    2    1    -1.0    7    1    -6.0    2    3     1.0
1    5    5     0.0    9    5    -4.0    1    4     3.0
2    1    3     2.0    1    3     2.0    2    2     0.0
3    3    8     5.0    0    2     2.0    3    1    -2.0
pd.concat

假设列名按照示例中的方式进行排序,您可以使用如下所示的numpy进行排序

df=pd.DataFrame([[2,1,7,1,2,3],[5,5,9,5,1,4],[1,3,1,3,2,2],[3,8,0,2,3,1]],列=('A_1','A_2','B_1','B_2','C_1','C_2'))
columns=np.unique(df.columns.str.split(“”).str[0])+np.array([“_1”、“_2”、“_diff”])。重塑(-1,1)
df=df.assign(**{key:0表示[2,:]}列中的键)。排序索引(axis=1)
df[columns[2,:]]=df[columns[1,:]]值-df[columns[0,:]]值
df

一种(对我来说)不需要使用
f字符串就更容易阅读的东西

for col in ['A','B','C']:
    df[f'{col}_diff'] = df[f'{col}_2'] - df[f'{col}_1']


   A_1  A_2  B_1  B_2  C_1  C_2  A_diff  B_diff  C_diff
0    2    1    7    1    2    3      -1      -6       1
1    5    5    9    5    1    4       0      -4       3
2    1    3    1    3    2    2       2       2       0
3    3    8    0    2    3    1       5       2      -2

pd.concat([d.assign(**{f'{k}{u Diff':d[f'{k}{u 2']-d[f'{k}{u 1']})对于k,d在df.groupby(lambda x:x.split(''u',1)[0],axis=1)],axis=1)
@piRSquared先生,你介意把它作为一个回答吗:-)我已经尝试过这个以及其他的解决方案,似乎更符合我的要求这本书读起来很好。但是困难的是获取与其相应列相邻的
{col}\u diff
列。。。理想情况下,不影响他们的顺序。除了piRSquared注释,我有数百列,因此无法使用此解决方案。。不过,谢谢。虽然这回答了我的问题,但我的实际列名比示例中显示的更复杂。我的实际列名如下:A_x_y_z_1,A_x_y_z_2,B_A_B_c_1,B_A_B_c_2,c_3_y_1,c_3_y_2试图相应地修改您的解决方案,但失败了,您能进一步帮助吗/我的实际列名比我前面提到的列名更复杂。下面的解决方案仅适用于简单的解决方案。
for col in ['A','B','C']:
    df[f'{col}_diff'] = df[f'{col}_2'] - df[f'{col}_1']


   A_1  A_2  B_1  B_2  C_1  C_2  A_diff  B_diff  C_diff
0    2    1    7    1    2    3      -1      -6       1
1    5    5    9    5    1    4       0      -4       3
2    1    3    1    3    2    2       2       2       0
3    3    8    0    2    3    1       5       2      -2