Pandas 列上的元数据丢失

Posted

技术标签:

【中文标题】Pandas 列上的元数据丢失【英文标题】:Lost metadata on Pandas columns 【发布时间】:2015-11-23 15:51:06 【问题描述】:

我正在处理时间序列数据,并试图根据该时间序列的原始采样频率(或其他相关元数据)对各种时间序列的操作进行限定。我可以通过以下方式成功设置元数据:

a_df._metadata = ["orig_freq"]
a_df["a_col"].orig_freq = "D"

这似乎是成功的。现在我想根据元数据标准应用函数:

for i in a_df.columns:
    if a_df[i].orig_freq == "D":
        a_df[i + "_a_new_col"] = a_function(a_df[i])
    else:
        a_df[i + "_a_new_col"] = a_function_2(a_df[i])

这适用于数据框中的第一列,但在成功操作该列后,我收到以下错误:

AttributeError: 'Series' object has no attribute 'orig_freq'

此时,所有分配的元数据都已删除。我在元数据分配中做错了吗?

【问题讨论】:

不应该是i.orig_freq吗? 元数据应该特定于每一列,代表一个不同的时间序列。整个数据框已标准化为单个采样频率,但我想保留每个包含列的单个原始采样频率的信息。谢谢! 【参考方案1】:

我认为_metadata 需要在类上定义(即Series._metadata),尽管即使那样,也可能存在一些问题。例如,请参阅此issue 进行更多讨论。

如果每一列都有一个元数据,那么使用MultiIndex 列来存储它可能会更轻松。例如,像这样:

In [43]: df = pd.DataFrame('a':[1,2,3], 'b':[4,5,6])

In [44]: orig_freqs = 'a': 'D', 'b': 'Q'

In [45]: df.columns = pd.MultiIndex.from_tuples(([(c, orig_freqs[c]) for c in df]))

In [46]: df
Out[46]: 
   a  b
   D  Q
0  1  4
1  2  5
2  3  6

In [47]: for (col, orig_freq) in df:
    ...:     df[('new_col', orig_freq)] = a_function(df[(col, orig_freq)])

【讨论】:

这太好了,谢谢。是的,我想为类定义元数据会有问题。

以上是关于Pandas 列上的元数据丢失的主要内容,如果未能解决你的问题,请参考以下文章

pandas处理丢失数据-老鱼学pandas

Python、Pandas:80/20 随机拆分数据;当索引值“丢失”时如何循环?

HP EVA4400服务器RAID信息丢失数据恢复方法

使用 Pandas query() 过滤时间戳列上的数据帧

Pandas处理丢失数据

Pandas 将多个数据帧与存储在多个列上的查找值合并