熊猫将两列合并为一并排除NaN值

时间:2020-02-09 00:25:29

标签: python pandas dataframe

我有一个5k x 2列的数据框,称为“两个”。 我想通过将一列中的任何NaN值替换为相邻列的值来创建新的5k x 1 DataFrame或列(无关紧要)。

例如:

    Gains  Loss
0    NaN   NaN
1    NaN -0.17
2    NaN -0.13
3    NaN -0.75
4    NaN -0.17
5    NaN -0.99
6   1.06   NaN
7    NaN -1.29
8    NaN -0.42
9   0.14  NaN

因此,例如,我需要将第1行到第5行中第一列中的NaN替换为第二行中相同行中的值,以获取具有以下形式的新df:

    Change  
0     NaN  
1    -0.17 
2    -0.13  
3    -0.75 
4    -0.17  
5    -0.99  
6    1.06  

我如何告诉python做到这一点?

3 个答案:

答案 0 :(得分:2)

您可以使用零填充NaN值,然后只需添加列即可:

both["Change"] = both["Gains"].fillna(0) + both["Loss"].fillna(0)

然后-如果需要-您可以将得到的零返回给NaN

both["Change"].replace(0, np.nan, inplace=True)

结果:

    Gains      Loss  Change
0     NaN       NaN     NaN
1     NaN     -0.17   -0.17
2     NaN     -0.13   -0.13
3     NaN     -0.75   -0.75
4     NaN     -0.17   -0.17
5     NaN     -0.99   -0.99
6    1.06       NaN    1.06
7     NaN     -1.29   -1.29
8     NaN     -0.42   -0.42
9    0.14       NaN    0.14

最后,如果您想摆脱原始列,可以将其删除:

both.drop(columns=["Gains", "Loss"], inplace=True)

答案 1 :(得分:0)

IIUC,我们可以过滤空值,然后对列进行求和以创建新的数据框。

cols = ['Gains','Loss']

s = df.isnull().cumsum(axis=1).eq(len(df.columns)).any(axis=1)
# add df[cols].isnull() if you only want to measure the price columns for nulls.

df['prices'] = df[cols].loc[~s].sum(axis=1)

df = df.drop(cols,axis=1)

print(df)

   prices
0     NaN
1   -0.17
2   -0.13
3   -0.75
4   -0.17
5   -0.99
6    1.06
7   -1.29
8   -0.42

答案 2 :(得分:0)

有很多方法可以实现这一目标。一种是使用loc属性:

import pandas as pd
import numpy as np

df = pd.DataFrame({'Price1': [np.nan,np.nan,np.nan,np.nan,
                              np.nan,np.nan,1.06,np.nan,np.nan],
                   'Price2': [np.nan,-0.17,-0.13,-0.75,-0.17,
                              -0.99,np.nan,-1.29,-0.42]})

df.loc[df['Price1'].isnull(), 'Price1'] = df['Price2']
df = df.loc[:6,'Price1']

print(df)

输出:

    Price1
0     NaN
1   -0.17
2   -0.13
3   -0.75
4   -0.17
5   -0.99
6    1.06

您可以在Cookbook

中看到更复杂的食谱