python - 为什么 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"
下面的示例显示了一个工作示例,请注意它需要loc
和iloc
。这是熊猫可以改进的地方吗?
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 )
推荐阅读
- c# - 在 ASP.NET Core 中间件构造函数中混合依赖注入和手动传递的参数
- python - 使用flask或python下载后是否可以删除图像文件
- ssh - 通过在 Linux 上运行 scp 从 Windows 源远程复制
- pandas - 在熊猫中使用 if 和 else 在新列中计算
- drupal-7 - Behat 2.5 with Drupal 7 - 步骤失败时重新启动场景执行
- reactjs - 如何将 React 应用程序连接到 SQL 应用程序
- ansible - 如何在ansible yaml文件中使用when条件?
- mysql - Mysql Select 有限制的查询
- apache-spark - spark覆盖保存模式是原子的吗?
- python - 有效地从 CSV 文件中删除列的 Python 脚本