如何通过位置或标签从数据框的单元格中获取值?

时间:2018-01-14 05:30:08

标签: python pandas dataframe

我阅读了问题"How to get a value from a cell of a dataframe?""How to select the last column of dataframe"。我对2018年从pandas数据帧的单元格中获取值的接受方法有点困惑,因为get_value已被弃用且at上的文档有些稀疏。我想按标签选择行,按位置/整数选择列。我的方法是在下面使用iloc 2018年接受的方法吗?我有这段代码:

import pandas as pd
import random
import string
import csv
import io

## Make a table with random column labels and rows in random order.
s = '\n'.join((
    ## Separate columns by comma.
    ','.join((
        ## Join letters without a separator.
        ''.join((
            ## Randomly choose 3 characters for the labels from ascii_letters.
            random.choice(
                string.ascii_letters) for i in range(3))) for j in range(3))),
    ## Insert a header to distinguish rows with identical index keys x and y.
    '"Header I, II and III"',
    ## Randomly shuffle the rows under the first header.
    '\n'.join(random.sample(('x,0,1', 'y,2,3',), 2)),
    ## Insert a header to distinguish rows with identical index keys x and y.
    '"Header IV, V and VI"',
    ## Randomly shuffle the rows under the second header.
    '\n'.join(random.sample(('x,4,5', 'y,6,7'), 2)),
    ))

def preprocess(s):
    header = ''
    for l in csv.reader(io.StringIO(s)):
        if len(l) == 1:
            header = l[0]
            continue
        ## Append the header to distinguish identical labels x and y.
        l[0] = header + '; ' + l[0]
        yield l

print(s, end='\n\n')
## Preprocess the string to avoid duplicate row index keys x and y.
df = pd.DataFrame(preprocess(s))
print(df, end='\n\n')
## Set the index to be that of the first column.
df = df.set_index(0)
## First select the column by index using iloc
## and then select the relevant row by index label.
value = df.iloc[:,-1]['Header I, II and III; x']
print(value)

它生成一个字符串s,如下所示:

YuT,Uva,AsE
"Header I, II and III"
y,2,3
x,0,1
"Header IV, V and VI"
y,6,7
x,4,5

函数preprocess将其转换为数据框,如下所示:

                         0    1    2
0                    ; YuT  Uva  AsE
1  Header I, II and III; y    2    3
2  Header I, II and III; x    0    1
3   Header IV, V and VI; y    6    7
4   Header IV, V and VI; x    4    5

这是我感兴趣的标签为Header I, II and III; x的行的最后一列的值(整数1)。这是2018年的正确方法吗?

value = df.iloc[:,-1]['Header I, II and III; x']

我刚从2015年2月开始阅读一些非常有趣的问题"Loc vs. iloc vs. ix vs. at vs. iat?",从2015年7月开始阅读"pandas iloc vs ix vs loc explanation?"。如果我可以做这样的事情,那将会很棒,但我不能:< / p>

value = df.at['Header I, II and III; x', -1]
value = df['Header I, II and III; x'][-1]

2 个答案:

答案 0 :(得分:2)

第一件事是第一件事。 ix已被弃用,但ix允许您混合使用标签和索引器,并对其传递内容进行了大量猜测。

在今天的时代(目前的稳定版本为v0.22),ix已被弃用,因此请坚持使用明确的标签或基于位置的索引器:loc for基于标签的切片,iloc用于基于索引的切片; at用于基于标签的项目访问,iat用于基于索引的项目访问。

如果您知道标签是什么,请使用at访问单个项目

df.at['Header I, II and III; x', df.columns[-1]]

如果您知道该职位,请使用iat -

df.iat[2, -1]

通常,当您想要访问单个元素时使用*at,而当您想要访问行/列切片时使用*loc

答案 1 :(得分:1)

solution肯定有效:

value = df.at['Header I, II and III; x', df.columns[-1]]

对于像我这样喜欢老式字典的人,如果数据框不包含重复的行标签,也可以执行以下操作,这会阻止transpose工作:

d = df.transpose().to_dict('list')
value = d['Header I, II and III; x'][-1]