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_1或measurement_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)
设置一个阈值并删除任何具有多个NaN. 使用df.assign到fillna()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)