我有来自不同来源的测量数据,我想将其转换为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