如何在熊猫中使用.assign方法有条件地分配计算列?

时间:2019-09-07 22:11:13

标签: python pandas dataframe python-3.7

如何使用python pandas中的.assign方法在合并的数据框中进行条件计算?

我想比较两个python pandas数据帧(a和b)的列。我正在使用熊猫0.25.1。将数据框合并为新数据框后,我使用.assign方法创建新列,然后使用lambda函数计算指定列之间的绝对和相对增量。

如何进行这样的条件计算:如果value_x是NaN,则使用-value_y,如果value_y是NaN,则使用+ value_x?对于第二个分配,我需要计算:如果value_x为NaN,则使用-100;如果value_y为NaN,则使用+100。我该如何实现?

import pandas as pd

#intialise data of lists.
data_a = {
    'id': [1, 2, 3, 4],
    'name': ['tom', 'nick', 'krish', 'jack'],
    'value': [20, 21, 19, 18]
}

data_b = {
    'id': [2, 3, 4, 5],
    'name': ['nick', 'krish', 'jack', 'freddy'],
    'value': [30, 15, 19, 20]
}

# Create DataFrame
df_a = pd.DataFrame(data_a)
df_b = pd.DataFrame(data_b)

# merge the frames
df_concat = pd.merge(df_a, df_b, on=['id',  'name'], how='outer')

# Calculate differences
print(df_concat.assign(delta_abs=lambda x: x.value_x -x.value_y,delta_perc=lambda x: (x.value_x/x.value_y-1)*100)) 

   id    name  value_x  value_y  delta_abs  delta_perc
0   1     tom     20.0      NaN        NaN         NaN
1   2    nick     21.0     30.0       -9.0  -30.000000
2   3   krish     19.0     15.0        4.0   26.666667
3   4    jack     18.0     19.0       -1.0   -5.263158
4   5  freddy      NaN     20.0        NaN         NaN

1 个答案:

答案 0 :(得分:1)

您可以使用fillna()

df_concat.assign(
    delta_abs=lambda x: x.value_x.fillna(0) -x.value_y.fillna(0),
    delta_perc=lambda x: (
        x.value_x.fillna(x.value_y)/
        x.value_y.fillna(x.value_x)
    )*100
)