我有一个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做到这一点?
答案 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
中看到更复杂的食谱