Pandas 数据框宽 vs 长 - MULTIPLE df 的 unstack vs pivot vs external join

Posted

技术标签:

【中文标题】Pandas 数据框宽 vs 长 - MULTIPLE df 的 unstack vs pivot vs external join【英文标题】:Pandas dataframe wide vs long - unstack vs pivot vs outer join for MULTIPLE df 【发布时间】:2019-04-22 18:52:10 【问题描述】:

问题

我从设备中提取了一些巨大的数据帧,它们跟踪所述设备上的多次运行,每个记录多个传感器(电压、电流、转速、压力......等) 我需要扩大这个数据集以进行绘图和进一步分析,但不幸的是传感器上的时钟不同步,因此不同的参数被收集起来,每个参数都有自己的时间戳,并且长度可能不同(毫秒,所以有时 >10 行)。

我尝试过拆垛:

df.set_index(['index','start_time','param']).value.unstack().rename_axis(None, 1).reset_index()

旋转:

df.pivot_table(values = 'value', index = ['index','start_time'], columns = 'param')

但不同的长度会导致真正的问题(可以理解)。

我有代码可以根据日期(即单独运行)或参数转换为 dfs 字典,并且可以对每个运行或参数进行分析——但有大约 100 个传感器和 18 个月的运行时间( !)所以想确保没有办法做我想做的事......我认为这是某种多外部连接。由于长度不同,它需要用 NaN 填充空白 - 这很好 - 并找到任何参数的最大长度,以将日期的长度调整为。

模型数据集

开始

df_long = pd.DataFrame("Date" : np.array([1]*5 + [2]*3 + [3]*4 + [4]*2 + [5]*4),
                "Param" : list('aaabbabbabccaaaacc'),
                "value": [0.1, 0.2, 0.2, 1, 4, 0.6, 0.5, 90, 0.9, 8.8, 4.1, 0.4, 0.5, 0.1, 0.1, 0.3, 3.4, 5.1],
               "time" : [1,2,3,1,2,1,1,2,1,1,1,2,1,2,1,2,1,2]
                )

理想输出

df_wide = pd.DataFrame (
"Date" : [1,1,1,2,2,3,3,4,4,5,5],
"a": [0.1,0.2,0.2,0.6,'NaN',0.9,'NaN',0.5,0.1,0.1,0.3],
"time-a": [1,2,3,1,'NaN',1,'NaN',1,2,1,2],
"b": [1,4,'NaN',0.5,90,8.8,'NaN','NaN','NaN','NaN','NaN'],
"time-b": [1,2,'NaN', 1,2,1,'NaN','NaN','NaN','NaN','NaN'],
"c": ['NaN','NaN','NaN','NaN','NaN',4.1,0.4,'NaN','NaN',3.4,5.1],
"time-c": ['NaN','NaN','NaN','NaN','NaN',1,2,'NaN','NaN',1,2])    

非常感谢任何帮助

【问题讨论】:

df_longDate列等于1五次,但在df_wide中只等于1三次,是这部分的预期输出吗,如果是这样,根据什么逻辑? 随着 db 变宽,它也会缩短 - 因此参数 a 的 5 个 1 和参数 b 的 2 个 1 现在只有 3 个 1。这是标准的拆垛行为;这些问题是每个日期和每个参数的测量都是不同的长度 【参考方案1】:

pd.pivot_table

您可以旋转您的数据框。与您想要的输出的唯一区别是您只有一个 time 系列;如果您愿意,可以通过考虑其他系列中的空值来构造 time-atime-b 等。

res = pd.pivot_table(df_long, index=['Date', 'time'],
                     columns=['Param'], values='value').reset_index()

print(res)

Param  Date  time    a     b    c
0         1     1  0.1   1.0  NaN
1         1     2  0.2   4.0  NaN
2         1     3  0.2   NaN  NaN
3         2     1  0.6   0.5  NaN
4         2     2  NaN  90.0  NaN
5         3     1  0.9   8.8  4.1
6         3     2  NaN   NaN  0.4
7         4     1  0.5   NaN  NaN
8         4     2  0.1   NaN  NaN
9         5     1  0.1   NaN  3.4
10        5     2  0.3   NaN  5.1

【讨论】:

我痴迷于将时间分开——这不是必需的!谢谢,这行得通。烦人的是我大部分时间都在那里!干杯 如果我想保持时间序列分开(如您的回答中提到的那样),它将如何工作? 你会做类似df['time-a'] = df['time'].mask(df['a'].isnull())的事情。

以上是关于Pandas 数据框宽 vs 长 - MULTIPLE df 的 unstack vs pivot vs external join的主要内容,如果未能解决你的问题,请参考以下文章

Pandas 合并、缩放和旋转长格式和宽格式数据帧

Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?

从 pandas 长格式创建事件图

将 pandas 数据帧旋转为具有多层的长格式

Pandas 数据框将长字符串列动态操作为 2 列

Python Pandas 创建一长串要连接的数据框