Python 我想通过在数据框中添加两个连续列来插入新列
我有一个包含大量列和重复模式的数据框。我喜欢在每个模式之间插入一列(Diff),这样该列就包含了前面列的差异。也许我可以用一个例子来更好地描述它: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
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