熊猫 iloc 和 loc & multiindex

Posted

技术标签:

【中文标题】熊猫 iloc 和 loc & multiindex【英文标题】:Pandas iloc & loc & multi index 【发布时间】:2021-12-06 04:41:43 【问题描述】:

我有一个像这样的数据框:

所以我想通过两个“for循环”添加一些列,例如:

如图所示的新数据框:

我的代码不起作用:

for I in range(0,len(df["date"]):
    for sigma in rang(1,2/5):
       df["P*sigma"].iloc[0:i]=df["p"].iloc[0:i]*df["sigma"].iloc[sigma]
print(df)

如何编写代码来获取第二张图片一样的数据帧?

【问题讨论】:

我认为这是不可能的,因为 pandas 需要完整的行,但您可能也不需要它。您应该只为相同的每一行重复 sigma 值,信息内容将相同,例如:***.com/questions/22937650/… 【参考方案1】:

您可以使用MultiIndex 执行此操作,可以通过多种方式完成此操作,但我始终更喜欢使用from_product()

请注意,在执行此操作之前,我们必须做一些准备工作。我们必须确保在原始 DataFrame 上正确设置索引,并且我们必须拉长原始 DataFrame 以允许新行。

import pandas as pd


df = pd.DataFrame('date': ['2020/01/01', '2020/01/02', '2020/01/03'], 'p': [123, 231, 188])
df = df.set_index('date')
sigma = [0, 1, 2, 5]

# Create new 2-level index
multi_index = pd.MultiIndex.from_product([sigma, df.index], names=['sigma', 'date'])

# Make longer
df = pd.concat([df] * len(sigma))

# Set new index
df = df.set_index(multi_index)

# Print result
print(df.head())
>>>                    p
>>> sigma p
>>> 0     2020/01/01  123
>>>       2020/01/02  231
>>>       2020/01/03  188
>>> 1     2020/01/01  123
>>>       2020/01/02  231

如果你想创建新列或使用索引值,你可以像这样获得get_level_values()

df["p*sigma"] = df.index.get_level_values("sigma") * df["p"]
print(df.head())
>>>                     p  p*sigma
>>> sigma date
>>> 0     2020/01/01  123        0
>>>       2020/01/02  231        0
>>>       2020/01/03  188        0
>>> 1     2020/01/01  123      123

【讨论】:

【参考方案2】:

像这样添加行和列“sigma”后 您可以像使用 DataFrame.apply 一样

df["P*sigma"] = df.apply(lambda x: x["p"] * x["sigma"], axis=1)

【讨论】:

但在此之前您必须乘以并添加“sigma”列。【参考方案3】:

在 python 中,您可以使用多重符号* 重复一个数组。如果您有免费的列sigmadatep,则很容易以正确的形状定义 DataFrame。要创建新列,只需执行元素乘法(无需调用apply()。之后,如果需要,您可以设置索引。

import pandas as pd
sigma = [0.5, 1, 2, 2/5]
date = ['2020/01//02', '2020/01//03', '2020/01//04']
p = [123,231,188]

df = pd.DataFrame('sigma':sigma*len(p), 'date':date*len(sigma), 'p':p*len(sigma))
df['p*sigma'] = df['p']*df['sigma']
df.set_index(['sigma', 'date'], inplace=True)
>>>df
                     p  p*sigma
sigma date                     
0.5   2020/01//02  123     61.5
1.0   2020/01//03  231    231.0
2.0   2020/01//04  188    376.0
0.4   2020/01//02  123     49.2
0.5   2020/01//03  231    115.5
...

【讨论】:

以上是关于熊猫 iloc 和 loc & multiindex的主要内容,如果未能解决你的问题,请参考以下文章

python [熊猫] .iloc和.loc

熊猫 iloc 返回与 loc 不同的范围 [重复]

Using iloc, loc, & ix to select rows and columns in Pandas DataFrames

熊猫 iloc 复杂切片每 n 行

Pandas Series .loc() 附加后访问错误

`.loc` 和 `.iloc` 与 MultiIndex'd DataFrame