python - 为什么 loc 和 iloc 对 pandas DataFrame 的行进行切片的工作方式不同?

标签 python pandas

我想要一个 DataFrame,其中一列的顶行(称为“cat”)的值为“LOW”,框架的中间和底部部分的值为“MID”和“HI”。因此,对于 1,200 行的帧,该值计为 cat列应导致:

LOW    400
MID    400
HI     400

这应该很容易。但显然事实并非如此。我尝试使用 df.loc[-400:,["cat"]] = "HI" 选择并更改底部行,但无济于事。

但是,这种方法确实适用于顶行:df.loc[:399,["cat"]] = "LOW"

下面的示例显示了一个工作示例,请注意,它需要 lociloc 。这是 pandas 可以改进的地方吗?

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.random([1200, 4]), columns=['A', 'B', 'C', 'D'])
df["cat"] = "MID"
df.loc[:399,["cat"]] = "LOW"
df.iloc[-400:,-1] = "HI"  # The -1 selects the last column ('cat') - not ideal.
df.cat.value_counts()

最佳答案

使用get_loc对于列 cat 的位置,如果想按 iloc 的位置进行选择 - 需要索引和列的位置:

df = pd.DataFrame(np.random.random([1200, 4]), columns=['A', 'B', 'C', 'D'])
df["cat"] = "MID"

df.iloc[:400,df.columns.get_loc('cat')] = "LOW"
df.iloc[-400:,df.columns.get_loc('cat')] = "HI"

详细信息:

print (df.columns.get_loc('cat'))
4

替代方法是使用 loc 通过标签进行选择 - 然后需要通过索引选择 400 索引值:

df.loc[df.index[:400],"cat"] = "LOW"
df.loc[df.index[-400:],"cat"] = "HI"

a = df.cat.value_counts()
print (a)
MID    400
HI     400
LOW    400
Name: cat, dtype: int64

设置 400 值的另一种方法是使用 numpy.repeat或通过重复列表设置值:

df["cat"] =  np.array(["LOW", "MID", "HI"]).repeat(400)

df["cat"] =  ["LOW"] * 400 + ["MID"] * 400 +  ["HI"] * 400
#thanks  @Quickbeam2k1
df = df.assign(cat = ['LOW']*400 + ['MID']*400 + ['HIGH']*400 )

关于python - 为什么 loc 和 iloc 对 pandas DataFrame 的行进行切片的工作方式不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51229216/

相关文章:

python - 是换行符 "\n"2个字符还是1个字符

python selenium 从多个 href 列表中抓取

python - 未为此客户端启用 AWS Cognito 身份验证 USER_PASSWORD_AUTH 流程

python - 从 Dataframe 中的 2 个或更多列获取唯一值的有效方法

python - Pandas 系列列表到一个系列

Python 类构造函数(静态)

python - 数据库优先 Django 模型

python - 在可能的情况下,将字符串转换为所有 pandas 列中的 float

python - 如何将 pandas 中的多列转换为单独的行/值?

python - pandas 应用的可能加速