有没有办法将数据源上的信息附加到熊猫系列?目前,我只是在数据框中添加了列,以指示每个变量的来源...
非常感谢您的想法和建议!
答案 0 :(得分: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
请注意,如here所述,对诸如GroupBy
,pivot
等数据帧的操作可能会返回删除了属性的数据副本。
最后,对于存储数据帧或附加元数据的系列,您可能希望考虑使用HDF5。例如,请参见this answer。
答案 1 :(得分:1)
要让原始数据结构具有其他属性,您应该 让
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()
)中,您的自定义属性仍然会丢失。