我有一个数据列,其中包含大量列并具有重复模式。我喜欢在每个模式之间插入一列(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
答案 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