熊猫 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 中,您可以使用多重符号*
重复一个数组。如果您有免费的列sigma
、date
和p
,则很容易以正确的形状定义 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的主要内容,如果未能解决你的问题,请参考以下文章
Using iloc, loc, & ix to select rows and columns in Pandas DataFrames