我有一个针对特定股权的公司行为的数据框。它看起来像这样:
0 Declared Date Ex-Date Record Date
BAR_DATE
2018-01-17 2017-02-21 2017-08-09 2017-08-11
2018-01-16 2017-02-21 2017-05-10 2017-06-05
除了它有数百行,但这并不重要。我从其中一个列创建了索引“BAR_DATE”,这是0来自BAR_DATE之上。
我想要做的是能够引用数据帧的特定元素并返回索引值,或者BAR_DATE,我认为它会是这样的:
index_value = cacs.iloc[5, :].index.get_values()
除了index_value成为列名,而不是索引。现在,这可能源于对pandas数据帧中索引的理解不足,因此对于其他人来说,这可能或者可能不容易解决。
我查看过其他一些问题,包括this one,但它也会返回列值。
答案 0 :(得分:2)
你的代码非常接近,但你只需要比你需要的更进一步。
# creates a slice of the dataframe where the row is at iloc 5 (row number 5) and where the slice includes all columns
slice_of_df = cacs.iloc[5, :]
# returns the index of the slice
# this will be an Index() object
index_of_slice = slice_of_df.index
从这里我们可以使用Index
对象上的文档:https://pandas.pydata.org/pandas-docs/stable/generated/pandas.Index.html
# turns the index into a list of values in the index
index_list = index_of_slice.to_list()
# gets the first index value
first_value = index_list[0]
关于Index
最重要的一点是它是一个自己的对象,因此如果我们想要一个索引以外的东西,我们需要将它改为我们期望使用的类型。这是文档可以提供巨大帮助的地方。
编辑:事实证明,在这种情况下,iloc返回一个Series
对象,这就是解决方案返回错误值的原因。知道这一点,新的解决方案将是:
# creates a Series object from row 5 (technically the 6th row)
row_as_series = cacs.iloc[5, :]
# the name of a series relates to it's index
index_of_series = row_as_series.name
这将是单行索引的方法。您可以将前一种方法用于多行索引,其中返回值为DataFrame
而不是Series
。
不幸的是,我不知道如何将Series
强制转换为DataFrame
单行切片,而不是显式转换:
row_as_df = DataFrame(cacs.iloc[5, :])
虽然这样可行,并且第一种方法很乐意接受并返回索引,但可能有一个原因是为什么Pandas没有为单行切片返回DataFrame
所以我对此犹豫不决提供此解决方案。