首页 > 解决方案 > 为什么 loc 和 iloc 在对 pandas DataFrame 的行进行切片时工作方式不同?

问题描述

我想要一个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。这是熊猫可以改进的地方吗?

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()

标签: pythonpandas

解决方案


如果想要按位置选择,则get_loc用于列的位置- 需要索引和列的位置:catiloc

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 )

推荐阅读