如何将具有(某些)相同值的两列的值移动到新列

时间:2018-10-26 23:00:34

标签: python pandas

我有一个看起来像这样的数据框:

import pandas as pd
import numpy as np

df = pd.DataFrame({"Amount1": [100, 100, 100, 200, 250, 280, 300, 350, 370, np.NaN, np.NaN, np.NaN], 
                   "Amount2": [100, 100, 100, np.NaN, np.NaN, np.NaN, 300, 350, 370, 500, 510, 540]})

我想将这些值移到新列中,在存在的地方取有效值,在两个值都存在时只移入其中一个值。我正在考虑映射lambda x,但我只在一列上使用过它。我尝试了以下代码:

df['Amount1', 'Amount2'].map(lambda x: x if x in 'Amount1' or 'Amount2' else np.NaN)

这是我的预期结果:

df2 = pd.DataFrame({"Amount3": [100, 100, 100, 200, 250, 280, 300, 350, 370, 500, 510, 540]})

有帮助吗?

2 个答案:

答案 0 :(得分:1)

您可以使用apply

import pandas as pd
import numpy as np

df = pd.DataFrame({"Amount1": [100, 100, 100, 200, 250, 280, 300, 350, 370, np.NaN, np.NaN, np.NaN],
                   "Amount2": [100, 100, 100, np.NaN, np.NaN, np.NaN, 300, 350, 370, 500, 510, 540]})


def shift(row):
    return row['Amount1'] if not np.isnan(row['Amount1']) else row['Amount2']


df2 = df[['Amount1', 'Amount2']].apply(shift, axis=1)
print(df2)

输出

0     100.0
1     100.0
2     100.0
3     200.0
4     250.0
5     280.0
6     300.0
7     350.0
8     370.0
9     500.0
10    510.0
11    540.0
dtype: float64

答案 1 :(得分:1)

这是另一种方法,不使用apply,而是利用pd.np.nanmax

df2 = pd.DataFrame(pd.np.nanmax(df.values.astype(int),axis=1),columns=['Amount3'])

>>> df2
    Amount3
0       100
1       100
2       100
3       200
4       250
5       280
6       300
7       350
8       370
9       500
10      510
11      540

或者使用pd.np.partition

df2 = pd.DataFrame(pd.np.partition(df.values,1)[:,0],columns=['Amount3']).astype(int)

>>> df2
    Amount3
0       100
1       100
2       100
3       200
4       250
5       280
6       300
7       350
8       370
9       500
10      510
11      540