通过使用for循环更改一列来创建多数据帧?

时间:2019-07-03 14:28:18

标签: python pandas dataframe indexing

我正在使用可变的冷却时间来计算乏燃料棒的热衰减。如何通过使用for循环更改冷却时间列来创建多个数据帧,然后将它们写入文件中?

我使用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"

谢谢您的帮助。

2 个答案:

答案 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
}