【发布时间】:2018-10-08 09:25:08
【问题描述】:
有没有办法将数据源的信息附加到熊猫系列?目前我只是在数据框中添加列来指示每个变量的来源...
非常感谢您的想法和建议!
【问题讨论】:
-
整个系列会有一个来源,还是每一行/标签都有不同的来源?
-
整个系列都是一样的..
标签: python pandas metadata series
有没有办法将数据源的信息附加到熊猫系列?目前我只是在数据框中添加列来指示每个变量的来源...
非常感谢您的想法和建议!
【问题讨论】:
标签: python pandas metadata series
来自官方pandas documentation:
要让原始数据结构具有附加属性,您应该 让
pandas知道添加了哪些属性。pandas地图未知 覆盖__getattribute__的数据名称的属性。定义 原始属性可以通过以下两种方式之一完成:
为不会传递给操作结果的临时属性定义
_internal_names和_internal_names_set。为将传递给操作结果的普通属性定义
_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()),您的自定义属性仍然会丢失。
【讨论】:
DataFrame,而不是 Series 对象...
DataFrame 创建的Series 对象(例如通过切片)确实不会继承数据框的元数据属性。另请参阅pandas github issue #19850。
像大多数 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
请注意,GroupBy、pivot 等数据帧上的操作(如 here 所述)可能会返回已删除属性的数据副本。
最后,对于存储带有元数据的数据帧或系列,您不妨考虑使用 HDF5。例如,请参阅this answer。
【讨论】: