【问题标题】:Efficiently sort data into a DataFrame有效地将数据分类到 DataFrame 中
【发布时间】:2022-06-30 22:03:50
【问题描述】:

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

谢谢。

【问题讨论】:

  • 您是否只是在连续的每个“B”之后插入三个 np.NaN?还有其他触发因素吗?

标签: python pandas dataframe


【解决方案1】:

你可以的

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

【讨论】:

  • 谢谢,这绝对比遍历原始数据好!
猜你喜欢
  • 2020-08-11
  • 2021-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-07-28
  • 2018-11-30
  • 2017-08-31
  • 2021-03-31
相关资源
最近更新 更多