我正在尝试开发一些代码,用于提取发电厂启动时的电价。为了给出一个例子,请参考下面的数据帧。
data = {
'Power_Price': [10, 11,15, 33, 50, 10, 12, 20, 17],
'Plant_Ops_1': [0, 0, 10, 10, 10, 0, 0, 10, 10],
'Plant_Ops_2': [0, 0, 0, 50, 50, 0, 0, 0, 0]
}
df = pd.DataFrame (data, columns = ['Power_Price','Plant_Ops_1','Plant_Ops_2'])
基于此,我的目标是开发一些代码,当工厂运行列从0转换为大于0的数字(即,当电厂启动时)时,将在数据帧中存储电价。在上述数据的情况下,输出将类似于以下内容:
data_out = {
'Plant': ['Plant_Ops_1', 'Plant_Ops_1', 'Plant_Ops_2'],
'Power_price': [15, 20, 33]
}
df_out = pd.DataFrame (data_out, columns = ['Plant','Power_price'])
希望这是有意义的。当然,欢迎您能够提供的任何建议或指导。
发布于 2021-06-17 18:26:32
对每组移位等于0
且更大的筛选行使用DataFrame.melt
,就像boolean indexing
中的0
一样
df = df.melt('Power_Price', var_name='Plant')
df = df[df.groupby('Plant')['value'].shift().eq(0) & df['value'].gt(0)].drop('value',axis=1)
print (df)
Power_Price Plant
2 15 Plant_Ops_1
7 20 Plant_Ops_1
12 33 Plant_Ops_2
如有必要,最后更改列的顺序:
df = df[["Plant", "Power_Price"]]
发布于 2021-06-17 18:17:54
您可以这样做:
df = df.melt(id_vars='Power_Price')
df[(df['value'] > df['value'].shift()) & (df['variable'] == df['variable'].shift())]
Power_Price variable value
2 15 Plant_Ops_1 10
7 20 Plant_Ops_1 10
12 33 Plant_Ops_2 50
发布于 2021-06-17 18:26:15
我希望我已经正确理解了你的问题:
df = df.melt(id_vars="Power_Price")
x = df["value"].eq(0)
x = df.groupby((x != x.shift()).cumsum()).head(1)
x = x[x["value"] > 0].rename(columns={"variable": "Plant"})[
["Plant", "Power_Price"]
]
print(x)
打印:
Plant Power_Price
2 Plant_Ops_1 15
7 Plant_Ops_1 20
12 Plant_Ops_2 33
https://stackoverflow.com/questions/68017264
复制相似问题