Python列差异

时间:2018-07-22 03:13:33

标签: python pandas

我需要创建一列来计算另一列元素之间的差异:

Column A    Computed Column
10           blank  # nothing to compute for first record
9            1  # = 10-9
7            2  # = 9-7
4            3  # = 7-4

我假设这是一个lambda函数,但是我不确定如何引用“ A列”中的元素

您能提供的任何帮助/指导都将非常感谢!

3 个答案:

答案 0 :(得分:2)

您可以通过移动列来做到这一点。

import pandas as pd

dict1 = {'A': [10,9,7,4]}
df = pd.DataFrame.from_dict(dict1)

df['Computed'] = df['A'].shift() - df['A']
print(df)

给予

    A  Computed
0  10       NaN
1   9       1.0
2   7       2.0
3   4       3.0

编辑:OP将他的要求扩展到多列

dict1 = {'A': [10,9,7,4], 'B': [10,9,7,4], 'C': [10,9,7,4]}
df = pd.DataFrame.from_dict(dict1)

columns_to_update = ['A', 'B']
for col in columns_to_update:
    df['Computed'+col] = df[col].shift() - df[col]
print(df)

通过使用columns_to_update,您可以选择所需的列。

    A   B   C  ComputedA  ComputedB
0  10  10  10        NaN        NaN
1   9   9   9        1.0        1.0
2   7   7   7        2.0        2.0
3   4   4   4        3.0        3.0

答案 1 :(得分:0)

我会做:

df = pd.DataFrame(data=[10,9,7,4], columns=['A'])
df['B'] = abs(df['A'].diff())

使用abs()的原因是因为diff()计算了current - previous之间的差,而您想要previous - current。该方法已经内置在Series类中,因此使用abs()可以通过采用任何一种绝对值来获得正确的结果。

支持:

import pandas as pd
df = pd.DataFrame(data=[10,9,7,4], columns=['A'])
df['B'] = abs(df['A'].diff())
>>> df
# Output
    A    B
0  10  NaN
1   9  1.0
2   7  2.0
3   4  3.0
df2 = pd.DataFrame(data=[10,4,7,9], columns=['A'])
df2['B'] = abs(df2['A'].diff())
>>> df2
# Output
    A    B
0  10  NaN
1   4  6.0
2   7  3.0
3   9  2.0

要仍然执行@cosmic_inquiry的解决方案,请执行以下操作:

import pandas as pd
df = pd.DataFrame(data=[10,9,7,4], columns=['A'])
df2 = pd.DataFrame(data=[10,4,7,9], columns=['A'])
df['B'] = df['A'].diff() * -1
df2['B'] = df2['A'].diff() * -1
>>> df
# Output:
    A    B
0  10  NaN
1   9  1.0
2   7  2.0
3   4  3.0
>>> df2
# Output:
    A    B
0  10  NaN
1   4  6.0
2   7 -3.0
3   9 -2.0

答案 2 :(得分:0)

使用diff

df = pd.DataFrame(data=[10,9,7,4], columns=['A'])
df['B'] = df.A.diff(-1).shift(1)

输出:

df
Out[140]: 
    A    B
0  10  NaN
1   9  1.0
2   7  2.0
3   4  3.0