考虑两个系列,它们是类实例xyz的属性,以及包含它们的列表:
为了再现问题,想象s1和s2是:
s1 = pd.Series(np.random.rand(10))
s2 = pd.Series(np.random.rand(10))
list= [xyz.s1, xyz.s2]
鉴于列表,我如何提取系列'名字' s1'和' s2'?
我尝试过类似的事情:
series_names = [str(x) for x in list]
但它没有用;它试图转换系列'值为字符串,而不是系列'名。
此外,
series_names = [x.name for x in list]
导致:
series_names = ['xyz', 'xyz']
期望的输出:
series_names = ['s1', 's2']
答案 0 :(得分:1)
如果您因某种原因确实想保留名称,请将数据保存在字典而不是列表中。
series = {
's1': pd.Series(np.random.rand(10)),
's2': pd.Series(np.random.rand(10))
}
series_names = [x for x in series] # ['s1', 's2']
答案 1 :(得分:0)
您可以使用globals
功能执行某些操作:
>>> s1 = 'a'
>>> s2 = 'b'
>>> globals()
{..., 's1': 'a', 's2': 'b'}
所以你可以这样做:
def extract_name(value):
for k, v in globals().items():
if v is value:
yield k
这会生成一个生成器,因此如果两个变量引用同一个对象,它会捕获所有可能的名称:
>>> class A: pass
>>> a = A()
>>> b = a
>>> list(extract_name(a))
['a', 'b']
所以,你可以这样做:
>>> l = [s1, s2]
>>> [next(extract_name(v)) for v in l]
['s1', 's2']
(使用next
是从生成器中取出名称。)