我想要一个 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
。这是 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/