有效地将数据排序到DataFrame中



我有来自不同来源的测量数据,我想将其转换为DataFrame。但是,来自两个源的值不是同一类型的:

data_in = [
[1.1, 'A', 1,2,3],
[1.2, 'B', 10,20,30,40],
[2.1, 'A', 1.1,2.1,3.1],
[2.1, 'B', 11,21,31,41],
[3.1, 'A', 1.2,2.2,3.2],
[3.2, 'B', 12,22,32,42],
]
pd.DataFrame(data_in)
相反,生成的DataFrame应该像这样:
data_out = [
[1.1, 'A', 1,2,3],
[1.2, 'B', np.NaN,np.NaN,np.NaN,10,20,30,40],
[2.1, 'A', 1.1,2.1,3.1],
[2.1, 'B', np.NaN,np.NaN,np.NaN,11,21,31,41],
[3.1, 'A', 1.2,2.2,3.2],
[3.2, 'B', np.NaN,np.NaN,np.NaN,12,22,32,42],
]
pd.DataFrame(data_out, columns=['timestamp', 'source', 'val1', 'val2', 'val2', 'par1', 'par2', 'par3', 'par4'])

当然,我可以遍历数据并手动将每一行排序到专用的DataFrame中,然后合并它们,但我想知道是否有更有效或至少"更好"的方法。方法是使用pandas。

谢谢。

你可以做

df1 = df.copy()
df.iloc[:,2:] = df.iloc[:,2:].mask(df[1].eq('B'))
df1.iloc[:,2:] = df1.iloc[:,2:].where(df[1].eq('B'))
out = df.merge(df1, on = [0,1]).dropna(axis = 1, thresh = 1)
Out[298]: 
0  1  2_x  3_x  4_x   2_y   3_y   4_y   5_y
0  1.1  A  1.0  2.0  3.0   NaN   NaN   NaN   NaN
1  1.2  B  NaN  NaN  NaN  10.0  20.0  30.0  40.0
2  2.1  A  1.1  2.1  3.1   NaN   NaN   NaN   NaN
3  2.1  B  NaN  NaN  NaN  11.0  21.0  31.0  41.0
4  3.1  A  1.2  2.2  3.2   NaN   NaN   NaN   NaN
5  3.2  B  NaN  NaN  NaN  12.0  22.0  32.0  42.0

最新更新