首页 > 解决方案 > 如何进行数学运算{例如。diff()} 在 DataFrame 的多个列中,并将结果作为新列保存在同一个 DataFrame 中

问题描述

假设我有一个这样的数据框:

df=
    p1  v1  p2  v2  p3  v3  p4  v4  p5  v5  p6  v6
0   3   6   5   8   4   4   8   4   9   6   0   0
1   5   0   5   9   0   8   8   5   5   2   2   9
2   6   9   8   6   9   9   9   2   8   4   2   6
3   4   1   8   0   5   9   0   2   1   2   4   8
4   1   4   8   1   3   1   4   9   6   2   6   7
5   5   4   6   5   5   2   3   0   5   5   6   4
6   4   4   9   0   2   1   7   0   1   0   8   8
7   9   1   7   3   5   4   4   4   8   9   3   8
8   1   5   0   5   4   3   6   5   2   3   1   4
9   9   1   7   6   5   3   6   8   8   4   7   5
10  1   6   5   8   2   5   1   5   3   4   5   8
11  8   7   6   6   9   3   5   5   9   7   6   7

pv是针对不同样品(例如 1、2、3..等)测量的某些参数。现在我想将“p_”的所有列乘以一个数字,并在“v_”diff()的所有列上使用以减去该列的后续行。

我想使用相应的样本名称和数学运算的第一个字母将结果保存在同一个 DataFrame 中,例如Dv1Dv2用于输出df. diff('v1'), df.diff('v2')等。类似地,对于p的列,它就像Mp1

手动为每一列,我可以进行操作并保存结果,但这很乏味(因为样本数量非常多),所以我想使用 for 循环之类的条件来自动化它。

任何建议在 pandas 的 DataFrame 的多列中进行数学运算(减法、乘法或除法),并使用列名和数学运算名称的组合将结果作为新列保存在同一 DataFrame 中。

新的 DataFrame 应该如下所示p1 Mp1 v1 DV1 p2 Mp2 v2 Dv2 p3 Mp3 v3 Dv3.......

标签: pythonpandasdataframe

解决方案


试试这个:

# Find all columns that starts with p and followed by a number
p = df.columns[df.columns.str.match('p\d')]

# Find all columns that starts with v and followed by a number
v = df.columns[df.columns.str.match('v\d')]

# Multiply the p columns by 2
mp = df[p].mul(2).add_prefix('M')

# Take a diff of the v columns
dv = df[v].diff().add_prefix('D')

# The display order of the columns
cols = [f'{j}{i}' for i in range(1,7) for j in ['p', 'Mp', 'v', 'Dv']]

# The final result
final = pd.concat([df, mp, dv], axis=1)[cols]

推荐阅读