我阅读了问题"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]
答案 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]