我使用datetime
对象,通过从排放燃料棒的日期中减去未来的日期来创建多列冷却时间值。
然后我尝试使用for循环将这些列索引到新数据框中,以期通过在新函数中使用新创建的数据框来简化多个文件。
df = pd.read_excel('data')
df.columns = ['ID','Enr','Dis','Mtu']
# Discharge Dates
_0 = dt.datetime(2020,12,1)
_1 = dt.datetime(2021,6,1)
_2 = dt.datetime(2021,12,1)
_3 = dt.datetime(2022,6,1)
# Variable Cooling Time Columns
df['Ct_0[Years]'] = df['Dis'].apply(lambda x: (((_0 - x).days)/365))
df['Ct_1[Years]'] = df['Dis'].apply(lambda x: (((_1 - x).days)/365))
df['Ct_2[Years]'] = df['Dis'].apply(lambda x: (((_2 - x).days)/365))
df['Ct_3[Years]'] = df['Dis'].apply(lambda x: (((_3 - x).days)/365))
# Attempting to index columns into new data frame
for i in range(4):
df = df[['ID','Mtu','Enr','Ct_%i[Years]'%i]]
tfile = open('Inventory_FA_%s.prn'%i,'w')
### Apply conditions for flagging
tfile.close()
我期望将创建的冷却时间列索引到新定义的数据帧df
中。相反,我收到以下错误;
KeyError: "['Ct_1[Years]'] not in index"
谢谢您的帮助。
答案 0 :(得分:1)
您将在循环的每次迭代中使用以下行覆盖数据框:
df = df[['ID','Mtu','Enr','Ct_%i[Years]'%i]]
这就是为什么您在第一次迭代中就没问题的原因(错误没有说明'Ct_0[Years]'
不在索引中),然后在第二次迭代中死亡。除了在第一次迭代中选择的列以外,您已经删除了所有内容。而是将您的列选择到临时df中:
for i in range(4):
df_temp = df[['ID','Mtu','Enr','Ct_%i[Years]'%i]]
tfile = open('Inventory_FA_%s.prn'%i,'w')
### Apply conditions for flagging using df_temp
tfile.close()
根据您的条件,可能会有更好的方法来执行此操作,而无需临时查看数据框,但这应该会有所帮助。
答案 1 :(得分:0)
为什么要创建一个新的数据框?是只重组/删除列吗?Engineero是对的,您可以在每次迭代中有效地重写df。
无论如何,您都可以尝试:
[CmdletBinding()]
Param(
[Parameter(Mandatory=$false)][String]$Param1,
[Parameter(Mandatory=$false)][String]$Param2
)
function Test
{
Write-Host "Test Success"
}
function All
{
Write-Host "All Success"
}
If ($Param1 -eq "Test" -or $Param2 -eq "Test")
{
Test
}
If ($Param1 -eq "All" -or $Param2 -eq "All")
{
All
}