如何将 Pandas 数据框中的数字列与 NaN 结合?

Agu*_*tin 11 python dataframe pandas

我有一个这种格式的数据框:

ID measurement_1 measurement_2
0      3              NaN
1      NaN            5
2      NaN            7 
3      NaN            NaN
Run Code Online (Sandbox Code Playgroud)

我想结合到:

ID measurement measurement_type
0      3              1
1      5              2
2      7              2
Run Code Online (Sandbox Code Playgroud)

对于每一行,在其中一个measurement_1measurement_2列中都有一个值,而不是在两者中,另一列将为 NaN。在某些行中,两列都是 NaN。

我想为测量类型添加一列(取决于哪一列具有值)并从两列中取出实际值,并删除两列中都有 NaN 的行。

有没有简单的方法来做到这一点?

谢谢!

pol*_*ist 12

也许combine_first能帮上忙?

import numpy as np


df["measurement"] = df["measurement_1"].combine_first(df["measurement_2"])
df["measurement_type"] = np.where(df["measurement_1"].notnull(), 1, 2)
df.drop(["measurement_1", "measurement_2"], 1)
Run Code Online (Sandbox Code Playgroud)
    ID  measurement measurement_type
0   0   3           1
1   1   5           2
2   2   7           2

Run Code Online (Sandbox Code Playgroud)


Shu*_*rma 12

使用DataFrame.stack重塑数据框,然后使用reset_index和使用DataFrame.assign的列分配measurement_type使用Series.str.split+Series.str[:1]level_1

df1 = (
    df.set_index('ID').stack().reset_index(name='measurement')
    .assign(mesurement_type=lambda x: x.pop('level_1').str.split('_').str[-1])
)
Run Code Online (Sandbox Code Playgroud)

结果:

print(df1)
   ID  measurement mesurement_type
0   0          3.0               1
1   1          5.0               2
2   2          7.0               2
Run Code Online (Sandbox Code Playgroud)


wwn*_*nde 5

设置一个阈值并删除任何具有多个NaN. 使用df.assignfillna()measurement_1和应用np.where上measurement_2

  df= df.dropna(thresh=2).assign(measurement=df.measurement_1.fillna\
                             (df.measurement_2), measurement_type=np.where(df.measurement_2.isna(),1,2)).drop(columns=['measurement_1','measurement_2'])

    ID  measurement  measurement_type
0   0              3              1
1   1              5              2
2   2              7              2
Run Code Online (Sandbox Code Playgroud)