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

时间:2019-11-08 14:44:13

标签: 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          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

4 个答案:

答案 0 :(得分:3)

pd.concat

pd.concat([                                                       # concat all groups
    d.assign(**{f'{k}_Diff': d[f'{k}_2'] - d[f'{k}_1']})          # New Col with 'Diff'
    for k,d in df.groupby(lambda x: x.split('_', 1)[0], axis=1)   # Group w/Callable
], axis=1)

   A_1  A_2  A_Diff  B_1  B_2  B_Diff  C_1  C_2  C_Diff
0    2    1      -1    7    1      -6    2    3       1
1    5    5       0    9    5      -4    1    4       3
2    1    3       2    1    3       2    2    2       0
3    3    8       5    0    2       2    3    1      -2

答案 1 :(得分:2)

我们可以对列进行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

答案 2 :(得分:0)

假设列名按照您的示例进行了排序,则可以使用如下所示的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]], columns=('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"]).reshape(-1,1)
df = df.assign(**{key:0 for key in columns[2, :]}).sort_index(axis=1)
df[columns[2,:]] = df[columns[1,:]].values - df[columns[0,:]].values
df

答案 3 :(得分:0)

在使用f strings的情况下,如果没有pd.concat,对我来说,有些事情更容易阅读(对我来说)

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