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_long
中Date
列等于1
五次,但在df_wide
中只等于1
三次,是这部分的预期输出吗,如果是这样,根据什么逻辑?
随着 db 变宽,它也会缩短 - 因此参数 a
的 5 个 1 和参数 b
的 2 个 1 现在只有 3 个 1。这是标准的拆垛行为;这些问题是每个日期和每个参数的测量都是不同的长度
【参考方案1】:
pd.pivot_table
您可以旋转您的数据框。与您想要的输出的唯一区别是您只有一个 time
系列;如果您愿意,可以通过考虑其他系列中的空值来构造 time-a
、time-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的主要内容,如果未能解决你的问题,请参考以下文章