我有一个看起来像这样的数据框:
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]})
有帮助吗?
答案 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