【问题标题】:Attach data source info to pandas series将数据源信息附加到熊猫系列
【发布时间】:2018-10-08 09:25:08
【问题描述】:

有没有办法将数据源的信息附加到熊猫系列?目前我只是在数据框中添加列来指示每个变量的来源...

非常感谢您的想法和建议!

【问题讨论】:

标签: python pandas metadata series


【解决方案1】:

来自官方pandas documentation

要让原始数据结构具有附加属性,您应该 让pandas 知道添加了哪些属性。 pandas 地图未知 覆盖__getattribute__ 的数据名称的属性。定义 原始属性可以通过以下两种方式之一完成:

  1. 为不会传递给操作结果的临时属性定义 _internal_names_internal_names_set

  2. 为将传递给操作结果的普通属性定义_metadata

下面是定义两个原始属性的示例, “internal_cache”作为临时属性,“added_property”作为 普通属性

class SubclassedDataFrame2(DataFrame):

    # temporary properties
    _internal_names = pd.DataFrame._internal_names + ['internal_cache']
    _internal_names_set = set(_internal_names)

    # normal properties
    _metadata = ['added_property']

@property
def _constructor(self):
    return SubclassedDataFrame2

_

>>> df = SubclassedDataFrame2({'A': [1, 2, 3], 'B': [4, 5, 6], 'C': [7, 8, 9]})
>>> df
   A  B  C
0  1  4  7
1  2  5  8
2  3  6  9

>>> df.internal_cache = 'cached'
>>> df.added_property = 'property'

>>> df.internal_cache
cached
>>> df.added_property
property

# properties defined in _internal_names is reset after manipulation
>>> df[['A', 'B']].internal_cache
AttributeError: 'SubclassedDataFrame2' object has no attribute 'internal_cache'

# properties defined in _metadata are retained
>>> df[['A', 'B']].added_property
property

正如您所见,通过_metadata 定义自定义属性的好处是,属性将在(大多数)一对一数据帧操作期间自动传播。请注意,在多对一数据帧操作期间(例如 merge()concat()),您的自定义属性仍然会丢失。

【讨论】:

  • IIUC 这会将属性添加到 DataFrame,而不是 Series 对象...
  • @MicheldeRuiter 从DataFrame 创建的Series 对象(例如通过切片)确实不会继承数据框的元数据属性。另请参阅pandas github issue #19850
  • 当然,但它不能回答(和我的)问题。
【解决方案2】:

像大多数 Python 对象一样,您可以使用句点 (.) 语法添加属性。但是,您应该注意您的属性名称不要与标签冲突。这是一个演示:

import pandas as pd

s = pd.Series(list(range(3)), index=list('abc'))
s.a = 10
s.d = 20

print(s.a, s.d)

10 20

print(s)

a    10
b     1
c     2

如上所述,当您实际上想要添加a 属性时,您可能会无意中覆盖标签的值。如here 所述,缓解此问题的一种方法是执行简单检查:

if 'a' not in s:
    s.a = 100
else:
    print('Attempt to overwrite label when setting attribute aborted!')
    # or raise a custom error

请注意,GroupBypivot 等数据帧上的操作(如 here 所述)可能会返回已删除属性的数据副本。

最后,对于存储带有元数据的数据帧或系列,您不妨考虑使用 HDF5。例如,请参阅this answer

【讨论】:

    猜你喜欢
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 2019-10-01
    • 1970-01-01
    • 2018-02-28
    • 2020-06-03
    • 1970-01-01
    • 2018-02-08
    相关资源
    最近更新 更多